天天看點

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;
    }
}
           

最後顯示的内容是“九的九次方等于多少?”簡直就是程式設計之美啊,有沒有感覺到!

2018年第九屆藍橋杯省賽B組C/C++部分答案

這個時候就簡單了,打開系統電腦,馬上知道結果是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ㄒ)/~~]

第八題:水漫金山

(具體題名忘了,我覺得這個更符合意境),這個太騷了,想不出來

第九題:忘了

第十題:最大乘積

這題我用了貪心的方案,感覺不靠譜,還是不貼代碼了

2018年第九屆藍橋杯省賽B組C/C++部分答案

繼續閱讀