精华内容
下载资源
问答
  • 蓝桥杯第九届a组
    更多相关内容
  • 2018年4月1日蓝桥杯省赛第九届蓝桥杯真题C/C++(A组)!2018年4月1日蓝桥杯省赛第九届蓝桥杯真题C/C++(A组)
  • 2018第九届蓝桥杯省赛Java语言A组 全部10道题 祝大家取得好成绩!
  • 这是2018年省赛第九届蓝桥杯真题C/C++(C),新鲜出炉。。
  • A. 分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + … 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来。 类似: 3/2 当然,这只是加了前2项而已。分子分母要求互质。 注意: 需要提交的是已经约分...

    A. 分数
    1/1 + 1/2 + 1/4 + 1/8 + 1/16 + …
    每项是前一项的一半,如果一共有20项,
    求这个和是多少,结果用分数表示出来。
    类似:
    3/2
    当然,这只是加了前2项而已。分子分母要求互质。

    注意:
    需要提交的是已经约分过的分数,中间任何位置不能含有空格。
    请不要填写任何多余的文字或符号。

    答案:1048575/524288

    分析:等比数列求和 2^20 - 1/ 2 ^ 19 ,然后让分子和分母互质

    #include <iostream>
    using namespace std;
    int gcd(int a,int b)
    {
    	return b == 0 ? a : gcd(b,a % b);
     } 
    int main()
    {
    	int a = pow(2, 20) - 1;
    	int b = pow(2, 19);
    	int d = gcd(a, b);
    	a /= d, b /= d;
    	cout << a << "/" << b << endl;
    	return 0;
    }
    

    B. 星期一
    整个20世纪(1901年1月1日至2000年12月31日之间),一共有多少个星期一?
    (不要告诉我你不知道今天是星期几)

    注意:需要提交的只是一个整数,不要填写任何多余的内容或说明文字。

    分析:excel大法计算总天数 36524 ,然后除于7 = 5217,再看剩下的6天有没有星期1

    答案:5217

    B. 乘积尾零
    如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?

    5650 4542 3554 473 946 4114 3871 9073 90 4329
    2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
    9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
    1486 5722 3135 1170 4014 5510 5120 729 2880 9019
    2049 698 4582 4346 4427 646 9742 7340 1230 7683
    5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
    6701 6645 1671 5978 2704 9926 295 3125 3878 6785
    2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
    3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
    689 5510 8243 6114 337 4096 8199 7313 3685 211

    注意:需要提交的是一个整数,表示末尾零的个数。不要填写任何多余内容。

    分析:2 和 5乘积可以凑出一个0,只需要求100个数每个数他们约数是5或者2的数量,求总的2,和5数量的最小值

    答案:31
    代码:

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    int a[101];
    int cnt2,cnt5;
    void check(int k)
    {
    	while(k % 2 == 0)
    	{
    		cnt2 ++;
    		k /= 2;
    	}
    	while(k % 5 == 0)
    	{
    		cnt5 ++;
    		k /= 5;
    	}
    }
    int main()
    {
    	for(int i = 0;i < 100;i++)
    	{
    		cin >> a[i];;
    		check(a[i]);
    	}
    	cout << min(cnt2,cnt5);
    }
    

    D. 第几个幸运数
    到x星球旅行的游客都被发给一个整数,作为游客编号。x星的国王有个怪癖,他只喜欢数字3,5和7。国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。

    我们来看前10个幸运数字是:3 5 7 9 15 21 25 27 35 45,因而第11个幸运数字是:49

    小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。

    请你帮小明计算一下,59084709587505是第几个幸运数字。

    需要提交的是一个整数,请不要填写任何多余内容。

    答案:1905

    分析:每个幸运数一定满足3^i * 5^j * 7^k ,只要找出在59084709587505之前有多少个数满足3^i * 5^j * 7^k 那么就能得出这是第几个幸运数字,
    代码:

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    int res;
    long long n = 59084709587505;
    int main()
    {
    	for(int i = 0;pow(3,i) <= n;i++)
    	{
    		for(int j = 0;pow(5,j) <= n;j++)
    		for(int k = 0;pow(7,k) <= n;k++)
    		{
    			if(pow(3,i) * pow(5,j) * pow(7,k) <= n)
    			res++;
    		}
    	}
    	cout << res - 1 ;//i,j,k都为0不符合情况
    }
    

    E. 打印图形
    如下的程序会在控制台绘制分形图(就是整体与局部自相似的图形)。

    当n=1,2,3的时候,输出如下:
    请仔细分析程序,并填写划线部分缺少的代码。

    n=1时:

    在这里插入图片描述

    n=2时:

    在这里插入图片描述

    n=3时:
    在这里插入图片描述

    源程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    void show(char* buf, int w){
    	int i,j;
    	for(i=0; i<w; i++){
    		for(j=0; j<w; j++){
    			printf("%c", buf[i*w+j]==0? ' ' : 'o');
    		}
    		printf("\n");
    	}
    }
    
    void draw(char* buf, int w, int x, int y, int size){
    	if(size==1){
    		buf[y*w+x] = 1;
    		return;
    	}
    	
    	int n = _________________________ ; //填空
    	draw(buf, w, x, y, n);
    	draw(buf, w, x-n, y ,n);
    	draw(buf, w, x+n, y ,n);
    	draw(buf, w, x, y-n ,n);
    	draw(buf, w, x, y+n ,n);
    }
    
    int main()
    {
    	int N = 3;
    	int t = 1;
    	int i;
    	for(i=0; i<N; i++) t *= 3;
    	
    	char* buf = (char*)malloc(t*t);
    	for(i=0; i<t*t; i++) buf[i] = 0;
    	
    	draw(buf, t, t/2, t/2, t);
    	show(buf, t);
    	free(buf);
    	
    	return 0;
    }
    

    注意:只提交划线部分缺少的代码,不要抄写任何已经存在的代码或符号。

    分析
    答案:size / 3

    F. 航班时间
    【问题背景】

    小h前往美国参加了蓝桥杯国际赛。小h的女朋友发现小h上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。

    小h对超音速飞行感到十分恐惧。仔细观察后发现飞机的起降时间都是当地时间。由于北京和美国东部有12小时时差,故飞机总共需要14小时的飞行时间。

    不久后小h的女朋友去中东交换。小h并不知道中东与北京的时差。但是小h得到了女朋友来回航班的起降时间。小h想知道女朋友的航班飞行时间是多少。

    【问题描述】

    对于一个可能跨时区的航班,给定来回程的起降时间。假设飞机来回飞行时间相同,求飞机的飞行时间。

    【输入格式】

    从标准输入读入数据。
    一个输入包含多组数据。

    输入第一行为一个正整数T,表示输入数据组数。
    每组数据包含两行,第一行为去程的 起降 时间,第二行为回程的 起降 时间。
    起降时间的格式如下

    h1:m1:s1 h2:m2:s2

    h1:m1:s1 h3:m3:s3 (+1)

    h1:m1:s1 h4:m4:s4 (+2)
    表示该航班在当地时间h1时m1分s1秒起飞,

    第一种格式表示在当地时间 当日 h2时m2分s2秒降落
    第二种格式表示在当地时间 次日 h3时m3分s3秒降落。
    第三种格式表示在当地时间 第三天 h4时m4分s4秒降落。

    对于此题目中的所有以 hⓂ️s 形式给出的时间, 保证 ( 0<=h<=23, 0<=m,s<=59 ).

    【输出格式】

    输出到标准输出。

    对于每一组数据输出一行一个时间hh:mm:ss,表示飞行时间为hh小时mm分ss秒。
    注意,当时间为一位数时,要补齐前导零。如三小时四分五秒应写为03:04:05。

    【样例输入】

    3
    17:48:19 21:57:24
    11:05:18 15:14:23
    17:21:07 00:31:46 (+1)
    23:02:41 16:13:20 (+1)
    10:19:19 20:41:24
    22:19:04 16:41:09 (+1)
    【样例输出】

    04:09:05
    12:10:39
    14:22:05
    【限制与约定】

    保证输入时间合法,飞行时间不超过24小时。

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗 < 1000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

    注意:
    main函数需要返回0;
    只使用ANSI C/ANSI C++ 标准;
    不要调用依赖于编译环境或操作系统的特殊函数。
    所有依赖的函数必须明确地在源文件中 #include
    不能通过工程设置而省略常用头文件。

    提交程序时,注意选择所期望的语言类型和编译器类型。

    分析
    飞机在飞,由于人为规定的时区导致好像时间变慢或者快了(实际上没有)。这里很像我们高中物理学的运动学知识,我们可以假设一个场景——船在不平静水面行驶,船从一个点出发行驶了s路程后返回原点(期间船速不变),然后告诉我们来回整个过程回到原点的时间是t,问船在静水中行驶s路程需要多长时间。我们可以以水为参考系,那么显然这个时间为 t/2。

    这里要特别注意getline()函数会读取换行符。

    代码

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    int get_time()
    {
    	string s;
    	getline(cin, s);
    	if (s.length() < 20) s += " (+0)";
    	int h1, m1, s1, h2, m2, s2, d;
    	
    	sscanf(s.c_str(), "%d:%d:%d %d:%d:%d (+%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);
    	return h2 * 3600 + m2 * 60 + s2 + d * 3600 * 24 - h1 * 3600 - m1 * 60 - s1;
    }
    
    int main()
    {
    	int n;
    	cin >> n;
    	getchar();
    	while (n --)
    	{
    		int t = (get_time() + get_time()) / 2;
    		printf("%02d:%02d:%02d\n", t / 3600, t % 3600 / 60, t % 60);
    	}
    	return 0;
    }
    

    G. 三体攻击
    【题目描述】

    三体人将对地球发起攻击。为了抵御攻击,地球人派出了 A × B × C 艘战舰,在太空中排成一个 A 层 B 行 C 列的立方体。其中,第 i 层第 j 行第 k 列的战舰(记为战舰 (i, j, k))的生命值为 d(i, j, k)。

    三体人将会对地球发起 m 轮“立方体攻击”,每次攻击会对一个小立方体中的所有战舰都造成相同的伤害。具体地,第 t 轮攻击用 7 个参数 lat, rat, lbt, rbt, lct, rct, ht 描述;
    所有满足 i ∈ [lat, rat],j ∈ [lbt, rbt],k ∈ [lct, rct] 的战舰 (i, j, k) 会受到 ht 的伤害。如果一个战舰累计受到的总伤害超过其防御力,那么这个战舰会爆炸。

    地球指挥官希望你能告诉他,第一艘爆炸的战舰是在哪一轮攻击后爆炸的。

    【输入格式】

    从标准输入读入数据。

    第一行包括 4 个正整数 A, B, C, m;
    第二行包含 A × B × C 个整数,其中第 ((i − 1)×B + (j − 1)) × C + (k − 1)+1 个数为 d(i, j, k);
    第 3 到第 m + 2 行中,第 (t − 2) 行包含 7 个正整数 lat, rat, lbt, rbt, lct, rct, ht。

    【输出格式】

    输出到标准输出。

    输出第一个爆炸的战舰是在哪一轮攻击后爆炸的。保证一定存在这样的战舰。

    【样例输入】

    2 2 2 3
    1 1 1 1 1 1 1 1
    1 2 1 2 1 1 1
    1 1 1 2 1 2 1
    1 1 1 1 1 1 2
    【样例输出】

    2
    【样例解释】

    在第 2 轮攻击后,战舰 (1,1,1) 总共受到了 2 点伤害,超出其防御力导致爆炸。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    typedef long long LL;
    
    const int N=2000010;
    
    LL s[N];
    LL b[N],bp[N];
    int A,B,C,m;
    struct Op{
        int x1,x2,y1,y2,z1,z2,c;
    }op[N];
    
    int get(int i,int j,int k)
    {
        return ((i-1)*B+j-1)*C+k;
    }
    
    void insert(LL b[],int x1,int x2,int y1,int y2,int z1,int z2,int c)
    {
        b[get(x1,  y1,   z1)  ] +=c;
        b[get(x1,  y1,   z2+1)] -=c;
        b[get(x1,  y2+1, z1)  ] -=c;
        b[get(x1,  y2+1, z2+1)] +=c;
        b[get(x2+1,y1,   z1)  ] -=c;
        b[get(x2+1,y1,   z2+1)] +=c;
        b[get(x2+1,y2+1, z1)  ] +=c;
        b[get(x2+1,y2+1, z2+1)] -=c;
    }
    
    bool check(int t)
    {
        memcpy(bp,b,sizeof bp);
    
        for(int i=1;i<=t;i++) insert(bp,op[i].x1,op[i].x2,op[i].y1,op[i].y2,op[i].z1,op[i].z2,op[i].c);
    
        for(int i=1;i<=A;i++)
            for(int j=1;j<=B;j++)
                for(int k=1;k<=C;k++)
                {
                    bp[get(i,j,k)]+=bp[get(i,   j,   k-1)];
                    bp[get(i,j,k)]+=bp[get(i,   j-1, k)  ];
                    bp[get(i,j,k)]-=bp[get(i,   j-1, k-1)];
                    bp[get(i,j,k)]+=bp[get(i-1, j,   k)  ];
                    bp[get(i,j,k)]-=bp[get(i-1, j,   k-1)];
                    bp[get(i,j,k)]-=bp[get(i-1, j-1, k)  ];
                    bp[get(i,j,k)]+=bp[get(i-1, j-1, k-1)];
                    if(bp[get(i,j,k)]<0) return true;
                }
        return false;
    
    }
    
    int main()
    {
        scanf("%d%d%d%d",&A,&B,&C,&m);
    
        for(int i=1;i<=A;i++)
            for(int j=1;j<=B;j++)
                for(int k=1;k<=C;k++)
                {    
                    scanf("%lld",&s[get(i,j,k)]);
                    insert(b,i,i,j,j,k,k,s[get(i,j,k)]);
                }
        for(int i=1;i<=m;i++)
        {
            int x1,x2,y1,y2,z1,z2,c;
            scanf("%d%d%d%d%d%d%d",&x1,&x2,&y1,&y2,&z1,&z2,&c);
            op[i]={x1,x2,y1,y2,z1,z2,-1*c};
        }
        int l=1,r=m;
    
        while(l<r)
        {
            int mid=l+r>>1;
            if(check(mid)) r=mid;
            else l=mid+1;
        }
    
        printf("%d",l);
        return 0;
    }
    
    
    

    H. 地球变暖
    【题目描述】

    你有一张某海域NxN像素的照片,".“表示海洋、”#"表示陆地,如下所示:


    .##…
    .##…
    …##.
    …####.
    …###.

    其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。

    由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

    例如上图中的海域未来会变成如下样子:





    …#…


    请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

    【输入格式】

    第一行包含一个整数N。 (1 <= N <= 1000)
    以下N行N列代表一张海域照片。

    照片保证第1行、第1列、第N行、第N列的像素都是海洋。

    【输出格式】

    一个整数表示答案。

    【样例输入】

    7

    .##…
    .##…
    …##.
    …####.
    …###.

    【样例输出】

    1
    代码:

    #include<iostream>
    #include<string>
    using namespace std;
    int n,res = 0;
    const int N = 1010;
    char str[N][N];
    bool v[N][N];
    bool flag = true;
    int dx[4] = {0,1,0,-1},dy[4] = {1,0,-1,0};
    void change(int x,int y)//染色,海水淹没的地方置为*
    {
    
        for(int i = 0;i < 4;i++)
        {
            int x1 = dx[i] + x;
            int y1 = dy[i] + y;
            if(x1 >= 0 && y1 >= 0 &&  x1 < n && y1 < n && str[x1][y1] == '.')
            {
                str[x][y] = '*'; 
            }
        }
    }
    void dfs(int x,int y)
    {
        for(int i = 0;i < 4;i++)
        {
            int x1 = dx[i] + x;
            int y1 = dy[i] + y;
            if(x1 >= 0 && y1 >= 0 &&  x1 < n && y1 < n && (str[x1][y1] == '#' || str[x1][y1] == '*'))
            {
                if(str[x1][y1] == '#')//发现陆地存在
                flag = false;
                str[x1][y1] = '.'; //染色避免重复访问
                dfs(x1,y1);
    
            }
        }
    }
    int main()
    {
        cin >> n;
        int count = 0;
        for(int i = 0;i < n;i++)
        cin >> str[i];
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j < n;j++)
            {
                if(str[i][j] == '#')
                {
                    change(i,j);
                }
            }
        }
    
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j < n;j++)
            {
                flag = true;
                if(str[i][j] == '*')//重新遍历原来的陆地
                {
                    count++;//count记录的是岛屿个数
                    str[i][j] = '.';
                    dfs(i,j);
                }
                if(!flag)
                res++;//记录的是未被淹没的陆地个数
            }
        }
        cout << count -res;
    
    }
    

    I. 倍数问题
    【题目描述】

    众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。

    【输入格式】

    从标准输入读入数据。

    第一行包括 2 个正整数 n, K。
    第二行 n 个正整数,代表给定的 n 个数。

    【输出格式】

    输出到标准输出。
    输出一行一个整数代表所求的和。

    【样例入】

    4 3
    1 2 3 4
    【样例输出】

    9
    暴力超时代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 100010;
    int n,k;
    int a[N];
    int ways[N];
    int res = INT_MIN;
    void dfs(int u,int start)
    {
        if(u == 3)
        {
            int sum = 0;
            for(int i = 0;i < 3;i++)
            {
                sum += ways[i];
                // cout << ways[i] << " ";
                
            }
        //   cout << sum <<  endl;
            if((sum % k) == 0 && sum > res)
            {
                res = sum;
            }
            return;
        }
        for(int i = start;i < n;i++)
        {
            ways[u] = a[i];
            dfs(u + 1,i + 1);
        }
    }
    int main()
    {
        cin >> n >> k;
        for(int i = 0;i < n;i++)
        cin >> a[i];
        dfs(0,0);
        cout << res;
        return 0;
    }
    

    标准代码:

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 1010;
    
    int f[4][N];
    int n, m;
    vector<int> v[N];
    
    
    int main()
    {
    	cin >> n >> m;
    	for (int i = 0; i < n; i++) 
    	{
    		int x;
    		cin >> x;
    		v[x % m].push_back(x);
    	}
    	memset(f, 0xcf, sizeof f);
    	f[0][0] = 0;
    	for (int i = 0; i < m; i++)
    	{
    		sort(v[i].begin(), v[i].end(), greater<int>());
    		for (int u = 0; u < min(3, (int)v[i].size()); u++)
    		{
    			int x = v[i][u];
    			for (int j = 3; j >= 1; j--)
    				for (int k = 0; k < m; k++)
    					f[j][k] = max(f[j][k], f[j - 1][(k - x % m + m) % m] + x);
    		}
    	}
    	cout << f[3][0] <<endl;
    	return 0;
    }
    

    J.付账问题
    【题目描述】

    几个人一起出去吃饭是常有的事。但在结帐的时候,常常会出现一些争执。

    现在有 n 个人出去吃饭,他们总共消费了 S 元。其中第 i 个人带了 ai 元。幸运的是,所有人带的钱的总数是足够付账的,但现在问题来了:每个人分别要出多少钱呢?

    为了公平起见,我们希望在总付钱量恰好为 S 的前提下,最后每个人付的钱的标准差最小。这里我们约定,每个人支付的钱数可以是任意非负实数,即可以不是1分钱的整数倍。你需要输出最小的标准差是多少。

    标准差的介绍:标准差是多个数与它们平均数差值的平方平均数,一般用于刻画这些数之间的“偏差有多大”。形式化地说,设第 i 个人付的钱为 bi 元,那么标准差为 : 如图

    【输入格式】

    从标准输入读入数据。

    第一行包含两个整数 n、S;
    第二行包含 n 个非负整数 a_1, a_2 …, a_。

    【输出格式】

    输出到标准输出。

    输出最小的标准差,四舍五入保留 4 位小数。
    保证正确答案在加上或减去 10−9 后不会导致四舍五入的结果发生变化。

    【样例1输入】

    5 2333
    666 666 666 666 666
    【样例输出】

    0.0000
    【样例解释】

    每个人都出 2333/5 元,标准差为 0。

    再比如:

    【样例输入】

    10 30
    2 1 4 7 4 8 3 6 4 7
    【样例输出】

    0.7928

    代码

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 100010;
    
    int n, s;
    int a[N];
    
    int main()
    {
    	cin >> n >> s;
    	for (int i = 0; i < n; i++) cin >> a[i];
    	sort(a, a + n);
    	double ave = n * 1.0 / s, cur_ave = ave, sum = 0.0;
    	for (int i = 0; i < n; i++)
    	{
    		if (cur_ave >= a[i])
    		{
    			s -= a[i];
    			cur_ave = s / (n - i + 1);
    			sum += (a[i] - cur_ave) * (a[i] - cur_ave); 
    		}
    		else sum += (a[i] - ave) * (a[i] - ave);
    	}
    	printf("%.4f", sum / n);
    	return 0;
    }
    
    展开全文
  • 2018 第九届 蓝桥杯大赛个人赛决赛-A组赛题 C++ 三角形面积 阅兵方阵 找假币 约瑟夫环 自描述序列 采油
  • 自己写的非正确答案 。2018第九届蓝桥杯Java语言C&答案
  • 十三届蓝桥杯省赛JavaB题目
  •  接下来n-1行描述油井之间的道路,其中的i行包含两个整数a,b,用一个空格分隔,表示一条道路的起点为i+1、终点为a,长度为b,道路是双向的,设备可以从任意一端运送到另一端,每条道路都可以经过任意多次。...

    1. 结果填空 (满分13分)
    标题:三角形面积

    已知三角形三个顶点在直角坐标系下的坐标分别为:
    (2.3, 2.5)
    (6.4, 3.1)
    (5.1, 7.2)

    求该三角形的面积。

    注意,要提交的是一个小数形式表示的浮点数。
    要求精确到小数后3位,如不足3位,需要补零。

    答案:

    #include <cstdio>
    #include <iostream>
    
    using namespace std;
    
    struct dian{
        double x,y;
    };
    
    int main()
    {
        dian A,B,C;
        scanf("%lf %lf %lf %lf %lf %lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y);
        double Area = 0.5*(A.x*B.y - A.x*C.y - B.x*A.y + A.y*C.x + B.x*C.y - C.x*B.y);
        printf("%.3lf\n",Area);
        return 0;
    }


    2. 结果填空 (满分39分)
    标题:阅兵方阵

    x国要参加同盟阅兵活动。
    主办方要求每个加盟国派出的士兵恰好能组成 2 个方阵。
    x国发现弱小的 y国派出了130人的队伍,他们的士兵在行进中可以变换2种队形:
     130 = 81 + 49 = 9^2 + 7^2
     130 = 121 + 9 = 11^2 + 3^2

    x国君很受刺激,觉得x国面积是y国的6倍,理应变出更多队形。
    于是他发号施令:
    我们要派出一支队伍,在行进中要变出 12 种队形!!!

    手下人可惨了,要忙着计算至少多少人才能组成 12 种不同的双方阵。
    请你利用计算机的优势来计算一下,至少需要多少士兵。

    (ps: 不要失去信心,1105人就能组成4种队形了)

    注意,需要提交的是一个整数,表示至少需要士兵数目,不要填写任何多余的内容。

    答案:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    
    using namespace std;
    int num[2000000],m = 2000000;
    int main()
    {
        for(int i = 1;i < 1000; ++i) {
            for(int j = i; j < 1000 ; ++j) {
                int d = i*i + j*j;
                num[d]++;
                if(num[d] >= 12) m = min(m,d);
            }
        }
        //打印看一下
        printf("%d\n",m);
        for(int i = 1;i * i * 2 <= m; ++i) {
            int d = (int)sqrt(m - i*i);//这一步用的十分细致
            if(d*d == m - i*i) {
                printf("%d^2 + %d^2 = %d\n", i , d , i*i + d*d);
            }
        }
        return 0;
    }


     

    3. 代码填空 (满分27分)

    
    标题:找假币
    
    在8枚硬币中,有1枚假币,假币外观与真币一模一样,只是重量略轻或略重一点。
    给你一架天平,要求最多称3次,就找出假币,并且知道它是重一些还是轻一些。
    下面的代码给出一个解决方案,仔细分析逻辑,填写划线位置缺少的代码。
    
    #include <stdio.h>
    
    int balance(int a, int b)
    {
    	if(a<b) return -1;
    	if(a>b) return 1;
    	return 0;
    }
    
    void judge(char* data, int a, int b, int std)
    {
    	switch(balance(data[a],data[std])){
    	case -1:
    		printf("%d light\n", a);
    		break;
    	case 0:
    		printf("%d heavy\n", b);
    		break;
    	case 1:
    		printf("err!\n", b);
    	}
    }
    
    // data 中8个元素,有一个假币,或轻或重
    void f(char* data)
    {
    	switch( ____________________________________ ){  // 填空
    	case -1:
    		switch(balance(data[0]+data[4],data[3]+data[1])){
    			case -1:
    				judge(data,0,3,1);
    				break;
    			case 0:
    				judge(data,2,5,0);
    				break;
    			case 1:
    				judge(data,1,4,0);
    		}
    		break;
    	case 0:
    		judge(data,6,7,0);		
    		break;
    	case 1:
    		switch(balance(data[0]+data[4],data[3]+data[1])){
    			case -1:
    				judge(data,4,1,0);
    				break;
    			case 0:
    				judge(data,5,2,0);
    				break;
    			case 1:
    				judge(data,3,0,1);
    		}
    		break;		
    	}	
    }
    
    int main()
    {
    	int n;
    	char buf[100];
    	
    	scanf("%d", &n);
    	gets(buf);
    	
    	int i;
    	for(i=0; i<n; i++){
    		gets(buf);
    		f(buf);
    	}
    	
    	return 0;
    }
    
    请注意:只需要填写划线部分缺少的内容,不要抄写已有的代码或符号。
    
    

    4. 程序设计(满分41分)


    标题:约瑟夫环

    n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。
    (报数是从1报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
    求最后剩下的人的编号。这就是著名的约瑟夫环问题。

    本题目就是已知 n,k 的情况下,求最后剩下的人的编号。

    题目的输入是一行,2个空格分开的整数n, k
    要求输出一个整数,表示最后剩下的人的编号。

    约定:0 < n,k < 1百万

    例如输入:
    10 3

    程序应该输出:
    4

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗  < 1000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

    注意:
    main函数需要返回0;
    只使用ANSI C/ANSI C++ 标准;
    不要调用依赖于编译环境或操作系统的特殊函数。
    所有依赖的函数必须明确地在源文件中 #include <xxx>
    不能通过工程设置而省略常用头文件。

    提交程序时,注意选择所期望的语言类型和编译器类型。

     

     

     

    5. 程序设计(满分71分)


    标题:自描述序列

    小明在研究一个序列,叫Golomb自描述序列,不妨将其记作{G(n)}。这个序列有2个很有趣的性质:

    1. 对于任意正整数n,n在整个序列中恰好出现G(n)次。
    2. 这个序列是不下降的。

    以下是{G(n)}的前几项:

    n         1    2    3    4    5    6    7    8    9    10    11    12    13
    G(n)    1    2    2    3    3    4    4    4    5    5      5      6      6

    给定一个整数n,你能帮小明算出G(n)的值吗?

    输入
    ----
    一个整数n。  

    对于30%的数据,1 <= n <= 1000000  
    对于70%的数据,1 <= n <= 1000000000  
    对于100%的数据,1 <= n <= 2000000000000000  

    输出
    ----
    一个整数G(n)


    【样例输入】
    13

    【样例输出】
    6

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗  < 1000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

    注意:
    main函数需要返回0;
    只使用ANSI C/ANSI C++ 标准;
    不要调用依赖于编译环境或操作系统的特殊函数。
    所有依赖的函数必须明确地在源文件中 #include <xxx>
    不能通过工程设置而省略常用头文件。

    提交程序时,注意选择所期望的语言类型和编译器类型。

     

     

     

    6. 程序设计(满分109分)
    标题:采油

    LQ公司是世界著名的石油公司,为世界供应优质石油。
    最近,LQ公司又在森林里发现了一大片区域的油田,可以在这个油田中开采n个油井。
    LQ公司在这n个油井之间修建了n-1条道路,每条道路连接两个油井,路径中间不会路过任何油井,而且这些道路将所有油井连通。
    建立油井的时候需要使用一台大型设备,运输起来非常麻烦,LQ公司准备在其中的一个油井位置建立一个空运站,先将设备空运到空运站,之后每次经过他们建立的道路来运输这个大型设备以建立不同的油井,当油井建立完毕后再从空运站将大型设备运走。
    为了减少运输的麻烦,公司要求大型设备在道路上运输的总路程是最短的。

    在建立油井和采油的过程中需要花费一些人力,第i个油井需要花费Bi个人,而一旦油井建成,就需要Si个人一直坚守在油井上进行维护。
    当然,如果一个人参与了油井的建设,他可以直接留下来维护油井,或者参与下一个油井的建设,但是在维护油井的人不能再参加后续油井的建设了。

    现在LQ公司想知道,大型设备运输的总路径长度最短是多少?在保证总路径长度最短的情况下,LQ公司至少需要花费多少人力才能完成所有油井的建立与维护。

    【输入格式】
      输入的第一行包含一个整数n,表示油井的数量。油井由1到n依次标号。
      第二行包含n个整数,依次表示B1, B2, …, Bn,相邻的整数之间用一个空格分隔。
      第三行包含n个整数,依次表示S1, S2, …, Sn,相邻的整数之间用一个空格分隔。
      接下来n-1行描述油井之间的道路,其中的第i行包含两个整数a,b,用一个空格分隔,表示一条道路的起点为i+1、终点为a,长度为b,道路是双向的,设备可以从任意一端运送到另一端,每条道路都可以经过任意多次。数据保证任意两个油井之间都可以通过道路连接。

    【输出格式】
      输出包含两个整数,用一个空格分隔,表示最优情况下大型设备需要运输的总路程,以及在总路程最短的情况下最少需要花费的人力数量。

    【样例输入】
    2
    10 20
    15 15
    1 8

    【样例输出】
    16 30

    【样例说明】
      有两种方案达到最优。
      方案一:在油井2建立空运站,先建立油井2,再将大型设备运输到油井1建立油井1,最后将大型设备运回油井2。
      方案二:在油井1建立空运站,先将大型设备运输到油井2建立油井2,再将大型设备运送到油井1建立油井1。

    【样例输入】
    6
    3 10 20 7 15 9
    2 6 10 4 8 7
    1 9
    1 2
    2 5
    3 4
    3 7

    【样例输出】
    54 38

    【数据规模和约定】
      对于20%的数据:n不超过10;
      另外20%的数据:每个油井最多和两个油井之间有道路直接连接;
      另外10%的数据:有n-1个油井只有一条道路与其他油井连接;
      对于100%的数据:n不超过100000,B、S、c均为不超过10000的正整数。

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗  < 1000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

    注意:
    main函数需要返回0;
    只使用ANSI C/ANSI C++ 标准;
    不要调用依赖于编译环境或操作系统的特殊函数。
    所有依赖的函数必须明确地在源文件中 #include <xxx>
    不能通过工程设置而省略常用头文件。

    提交程序时,注意选择所期望的语言类型和编译器类型。
     

     

     

    展开全文
  • 十一届蓝桥杯省赛C语言B.docx
  • 十三届蓝桥杯python C题目
  • 十三届蓝桥杯java C的题目以及比赛过程的答案(不是正确答案,个人的) , 记录一下一次参加蓝桥杯
  • 贪心-第九届蓝桥杯省赛C++A组-付账问题 题目: 几个人一起出去吃饭是常有的事。 但在结帐的时候,常常会出现一些争执。 现在有 n 个人出去吃饭,他们总共消费了 S 元。 其中第 i 个人带了 ai 元。 幸运的是,所有人...
  • 2018第九届蓝桥杯C/C++ A组试题答案参考

    万次阅读 多人点赞 2018-04-01 23:05:19
    3 5 7 9 15 21 25 27 35 45 因而11个幸运数字是:49 小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是几个幸运数字,否则领不到奖品。 请你帮小明计算一下,...

    题目1

    标题:分数

    1/1 + 1/2 + 1/4 + 1/8 + 1/16 + .... 
    每项是前一项的一半,如果一共有20项,
    求这个和是多少,结果用分数表示出来。
    类似:
    3/2
    当然,这只是加了前2项而已。分子分母要求互质。

    注意:
    需要提交的是已经约分过的分数,中间任何位置不能含有空格。

    请不要填写任何多余的文字或符号。

    解题思路:可直接手算通分,利用cmath里的pow()函数,很容易得出答案

    答案:1048575/524288

     

     

    题目2
    标题:星期一

    整个20世纪(1901年1月1日至2000年12月31日之间),一共有多少个星期一?
    (不要告诉我你不知道今天是星期几)

    注意:需要提交的只是一个整数,不要填写任何多余的内容或说明文字。

    解题思路:算出1901年第一天开始到2000年最后一天的总天数sum(注意闰年的判断),

    易得出sum=36525(天);由于2000年12月31日是周日,按照周日,六,五,四,三,

    二,一的顺序往前推,共有36525/7=5217 个循环,余数是6. 故可知这六个数分别对应

    的是前六项(不含周一)

    因此答案应为:5217

     

     

    题目3
    标题:乘积尾零

    如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?

    5650 4542 3554 473 946 4114 3871 9073 90 4329 
    2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 
    9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 
    1486 5722 3135 1170 4014 5510 5120 729 2880 9019 
    2049 698 4582 4346 4427 646 9742 7340 1230 7683 
    5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 
    6701 6645 1671 5978 2704 9926 295 3125 3878 6785 
    2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 
    3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 
    689 5510 8243 6114 337 4096 8199 7313 3685 211

    注意:需要提交的是一个整数,表示末尾零的个数。不要填写任何多余内容

    思路:两个数乘积结果产生0的情况只有两种:

    (1)这两个数的因子分别应含有2和5

    (2)某一个乘数本身含有尾零

    #include<iostream>
    using namespace std;


    int main()
    {
      int num_2=0;//含有因子2的个数 
        int num_5=0;//含有因子5的个数
    int a[10][10]={
    {5650,4542,3554,473, 946, 4114, 3871, 9073, 90, 4329},
    {2758 ,7949, 6113,5659, 5245, 7432, 3051, 4434, 6704, 3594}, 
    {9937 ,1173 ,6866,3397 ,4759, 7557, 3070, 2287, 1453, 9899},
    {1486 ,5722 ,3135,1170, 4014, 5510, 5120, 729, 2880, 9019},
    {2049 ,698 ,4582,4346 ,4427, 646, 9742, 7340, 1230, 7683},
    {5693 ,7015 ,6887,7381, 4172, 4341, 2909, 2027, 7355, 5649}, 
    {6701 ,6645 ,1671,5978 ,2704, 9926, 295, 3125, 3878, 6785},
    {2066,4247 ,4800,1578, 6652, 4616, 1113, 6205, 3264, 2915},
    {3966,5291 ,2904,1285, 2193, 1428, 2265, 8730, 9436, 7074},
    {689,5510,8243,6114, 337, 4096, 8199, 7313, 3685, 211}
    } ;
    int sum=0;
    for(int i=0;i<10;i++)
    {
    for(int j=0;j<10;j++)
    {
    while(a[i][j]%10==0)
    {
    sum++;a[i][j]/=10;//含有末尾0的话,sum直接+1; 
    }
    while(a[i][j]%2==0)
    {
    num_2++;a[i][j]/=2;
    }
    while(a[i][j]%5==0)
    {
    num_5++;a[i][j]/=5;
    }
    }
    }
    cout<<sum+((num_2<num_5)?num_2:num_5)<<endl;
    return 0;

    答案:31

     

     

    题目4
    标题:第几个幸运数

    到x星球旅行的游客都被发给一个整数,作为游客编号。
    x星的国王有个怪癖,他只喜欢数字3,5和7。
    国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。

    我们来看前10个幸运数字是:
    3 5 7 9 15 21 25 27 35 45
    因而第11个幸运数字是:49

    小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。

    请你帮小明计算一下,59084709587505是第几个幸运数字。

    需要提交的是一个整数,请不要填写任何多余内容。

    解题思路:用一个队列装幸运数,从3,5,7出发,依次将队首乘3,5,7的结果加入队尾(注意判重),直到出现目标59084709587505.

    程序代码如下:

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    long long q[10000];int mul[3]={3,5,7};
    int main()
    {
    memset(q,sizeof(q),0);
    q[0]=3;q[1]=5;q[2]=7;
    int front=0;int rear=3;
    while(front<rear)
    {
    for(int i=0;i<3;i++)
    {
    if(q[front]*mul[i]>59084709587505)continue;//大于59084709587505的排在后面的不入队列 
    long long t=q[front]*mul[i];
    bool exist=0;
    for(int j=rear-1;j>=0;j--)if(q[j]==t){exist=1;break;}//判断t是否已经在队列中 
    if(!exist)
    {
      q[rear]=t;rear++;//将t入队 
    if(t==59084709587505)//此时队尾元素已经是59084709587505,但还存在front到rear之间的元素和3,5,7相乘的结果小于59084709587505的可能 
    {
    for(int k=front;k<rear-1;k++)//以上<59084709587505的可能情况,都应加入队列中 
    {
    for(int i=0;i<3;i++)
    {
    long long t=q[k]*mul[i];
    if(t<59084709587505)
    {
    bool exist=0;
    for(int j=rear-1;j>=0;j--)if(q[j]==t){exist=1;break;}//判断t是否已经在队列中
    if(!exist)
    {
    q[rear]=t;rear++;
    }
    }
    }
    }

    sort(q,q+rear);//对3到59084709587505的幸运数进行排序 
    int pos=rear-1;
    while(q[pos]!=59084709587505)pos--;//查找排序后的59084709587505所在的下标序号 
    cout<<pos+1<<endl;return 0;
    }
    }
    }
    front++;
    }
      return 0;

    运行结果:1905

     

     

    题目5


    标题:打印图形

    如下的程序会在控制台绘制分形图(就是整体与局部自相似的图形)。

    当n=1,2,3的时候,输出如下:
    请仔细分析程序,并填写划线部分缺少的代码。

    n=1时:

    n=2时:

    n=3时:

    源程序:


    #include <stdio.h>
    #include <stdlib.h>

    void show(char* buf, int w){
    int i,j;
    for(i=0; i<w; i++){
    for(j=0; j<w; j++){
    printf("%c", buf[i*w+j]==0? ' ' : 'o');
    }
    printf("\n");
    }
    }

    void draw(char* buf, int w, int x, int y, int size){
    if(size==1){
    buf[y*w+x] = 1;
    return;
    }

    int n = _________________________ ; //填空
    draw(buf, w, x, y, n);
    draw(buf, w, x-n, y ,n);
    draw(buf, w, x+n, y ,n);
    draw(buf, w, x, y-n ,n);
    draw(buf, w, x, y+n ,n);
    }

    int main()
    {
    int N = 3;
    int t = 1;
    int i;
    for(i=0; i<N; i++) t *= 3;

    char* buf = (char*)malloc(t*t);
    for(i=0; i<t*t; i++) buf[i] = 0;

    draw(buf, t, t/2, t/2, t);
    show(buf, t);
    free(buf);

    return 0;
    }


    注意:只提交划线部分缺少的代码,不要抄写任何已经存在的代码或符号。

    解题思路:此题较简单。直接上答案: size/3

    展开全文
  • 三题标题:乘积尾零如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 ...
  • 第九届蓝桥杯bjava

    2020-06-07 13:02:37
    第一题: 标题:第几天 ...package 第九届蓝桥杯; public class Main01 { private static int month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; public static void main(String[] args) { /* *
  • 十二届蓝桥杯校内模拟赛大学C(C与C++)赛题
  • 蓝桥杯Java语言A组真题,题目文件与参赛时一模一样形式。每一道题一个文件。
  • 照片保证1行、1列、N行、N列的像素都是海洋。 【输出格式】 一个整数表示答案。 【输入样例】 7 … .##… .##… …##. …####. …###. … 【输出样例】 1 资源约定: 峰值内存消耗...
  • 20180401 第九届蓝桥杯C/C++真题 B ..................................................
  • 十三届蓝桥杯大赛软件类省赛C/C++_B试题
  • 第九届蓝桥杯C++A组

    2019-11-30 20:02:44
    几个幸运数 到x星球旅行的游客都被发给一个整数,作为游客编号。 x星的国王有个怪癖,他只喜欢数字3,5和7。 国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。 我们来看前10个幸运数字是: 3...
  • 十三届蓝桥杯大赛软件赛省赛_PythonA组试题.pdf
  • 文章目录A组高斯日记排他平方书振兴中华颠倒的价牌前缀判断逆波兰表达式错误票据买不到的数目剪格子大臣的旅费 由于没有OJ,不敢保证100%正确,但是自己测试都通过了的 A组 高斯日记 直接excel算,因为题目是...
  • 一、A.几天 二、B.明码 三、C.乘积尾零 四、D.测试次数 五、E.快速排序 六、F.递增三元 七、G.螺旋折线 八、H.日志统计 、I.全球变暖 十、J.乘积最大...
  • 届蓝桥杯A组C

    万次阅读 多人点赞 2019-10-28 18:47:30
     a[i] = a[j];  a[j] = t; } int partition(int a[], int p, int r) {  int i = p;  int j = r + 1;  int x = a[p];  while (1){  while (i<r && a[++i]);  while (a[--j]>x);  if (i >= j) break;  swap...
  • 第九届蓝桥杯JavaC组省赛真题

    万次阅读 多人点赞 2019-07-20 12:21:04
    解题代码部分来自网友,如果有...好心的老板答应包食宿,1天给他1元钱。 并且,以后的每一天都比前一天多2元钱,直到他有足够的钱买票。 请计算一下,小明在几天就能凑够108元,返回地球。 要求提交的是一个整...
  • 2018年第九届蓝桥杯C/C++省赛A组题解

    千次阅读 2018-04-04 09:18:25
    2018年第九届蓝桥杯C/C++省赛A组题解第一题:题意:就是求一个,首项为1,等比为1/2的等比数列的前二十项之和答案:就是2^20-1/2^19第二题:题意:求整个二十世纪总共有多少个星期一求解过程:当时灵机一动,打开...
  • python 2022十三届蓝桥杯大赛题目
  • 十三届蓝桥杯大赛软件赛省赛 Java 研究生组 赛题 研究生组、A组、B组、C组其实有些题应该都是一样的。免费分享、不要积分下载。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,518
精华内容 3,007
关键字:

蓝桥杯第九届a组