2018年第九届蓝桥杯省赛B组C/C++部分答案

第一题:第几天

这题压根不用写代码,打开系统日历,加一加就知道,是第31+29+31+30+4=125天

第二题:看字符回答数字

这道题目是给你一段多个汉字组成的信息,每个汉字用32个字节表示,这里给出了字节作为有符号整数的值。
题目的要求隐藏在这些信息中。你的任务是复原这些汉字的字形,从中看出题目的要求,并根据要求填写答案。
这段信息是(一共10个汉字):
4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0
16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16
4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0
0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4
4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64
16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128
0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0
2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0
1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0
0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0

其实这题很有意思,把每个数转成二进制,三个for循环就能搞定了。

我贴一下我的代码:

#include<iostream>
using namespace std;

int main()
{
    int m,n,w[16];
    while(cin>>m>>n)
    {
        for(int i=7;i>=0;i--){w[i]=m&1;m>>=1;}
        for(int i=15;i>=8;i--){w[i]=n&1;n>>=1;}
        for(int i=0;i<=15;i++){cout<<w[i]<<" ";}
        cout<<endl;
    }
}

最后显示的内容是“九的九次方等于多少?”简直就是编程之美啊,有没有感觉到!

点阵结果

这个时候就简单了,打开系统计算器,马上知道结果是387420489

第三题:乘积尾部0个数

如下的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

我比赛的时候,投机取巧地用了JAVA的BigInteger来写,结果为

112142221918653666702449201125076321480831896827506427440731023870278025729017605653056978504625081950967446934475613782859722081655293509714201067451491601144000940085173776751705443818861349991600968912829674368417898694508188364854988187881792613763161458365648071883922054736261940944120399031297726871056069331318210560000000000000000000000000000000

显然,能得出答案是31个0。

但如果正常一点来写,我们应该想到,应该先去掉所有数的结尾的0,并把0的个数先存起来,然后统计2因子和5因子的个数和数值,相乘后取出0,然后看乘积是否为2或者5因子,如果是因子数就加到因子数统计区,否则丢弃。

第四题:摔手机

这题不会,很奇怪的题目

第五题:代码填空--快查

其实这题按照前面的条件可以找出提示

答案是quick_select(a,i+1,r,k-i+l-1)

第六题:忘了

第七题:螺旋线

这题,刚开始看到数据规模为10亿,我是拒绝的,因为线性时间也会超时

但是最后我一想,既然是10亿,肯定是O(1)左右的时间就能算出来,那么,就肯定是跟数学公式有关,结果发现,只要是在刚好第三象限,x和y的值相等的情况下,到这个点的距离是4*k(k+1),k为当前的圈数。

#include<iostream>
using namespace std;

int main()
{
    long long m,n;cin>>m>>n;
    long long a_m=m>=0?m:-m;
    long long a_n=n>=0?n:-n;
    long long circle_num=max(a_m,a_n)-1;
    long long result=4*circle_num*(circle_num+1);
    if(circle_num<0){cout<<0<<endl;return 0;}
    if(m==n&&m<0){result=4*a_m*(a_m+1);cout<<result<<endl;return 0;}
    int i=-circle_num-1,j=-circle_num;result++;

    if(i<0&&i!=m){result+=2*circle_num+1;j+=2*circle_num+1;}else if(i<0&&i==m){result+=n-j;j=n;}
    //第三象限
    if(j>0&&j!=n){result+=2*circle_num+2;i+=2*circle_num+2;}else if(j>0&&j==n){result+=m-i;i=m;}
    //第二象限
    if(i>0&&i!=m){result+=2*circle_num+2;j-=2*circle_num+2;}else if(i>0&&i==m){result+=j-n;j=n;}
    //第一象限
    if(j<0&&j!=n){result+=2*circle_num+2;i-=2*circle_num+2;}else if(j<0&&j==n){result+=i-m;i=m;}
    //第四象限
    cout<<result<<endl;
    return 0;
}
只可惜比赛的时候不够时间写出来了[/(ㄒoㄒ)/~~]

第八题:水漫金山

(具体题名忘了,我觉得这个更符合意境),这个太骚了,想不出来

第九题:忘了

第十题:最大乘积

这题我用了贪心的方案,感觉不靠谱,还是不贴代码了


相关推荐
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页