2018年第九届蓝桥杯大赛软件类省赛C/C++B组参赛感想
生活随笔
收集整理的這篇文章主要介紹了
2018年第九届蓝桥杯大赛软件类省赛C/C++B组参赛感想
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本人大二,學校非985,非211,非雙一流,普通一本編程小白一枚,今年第一次入藍橋杯的坑,比賽之后頗有感觸,今日寫下某些我會做的題解,還不知答案和個人成績,所以也不敢妄言,大佬勿噴。
第一道簽到題,2000年1月1日是第一天,5月4日是第幾天。這道題沒有寫代碼,直接草稿紙手算,需要注意二月有29天。31+29+31+30+4=125,不知對不對。有大佬直接用Excel做出來了,看來我還是技不如人啊。 第二道題貌似有點難度了,反正我一眼沒看懂,后來明白了,題意大概是:漢字字形可以用16*16的像素表示,每個像素有兩種狀態,對應二進制數0和1,于是一個漢字就可以用256位二進制數表示,也就是32個字節。題目給出的是十組數據表示十個漢字的字形,每組數據為32個帶符號十進制數(對應八位二進制數,符號位為第一位),題目嘛,就是這十個字組成的一句話。首先寫個程序把漢字顯示出來:先把十進制數轉化為二進制,用個二維數組存儲,然后按條件打印出來好了。代碼如下: #include <iostream> #include <cstdio> #include <cmath>using namespace std;int s[32][8]={0};int main() {for(int i=0;i<32;i++) {int num;scanf("%d",&num);if(num<0) {s[i][0]=1;num=-num;}int temp=num;for(int j=7;j>0;j--) {s[i][j]=temp%2;temp/=2;}}for(int i=0;i<16;i++) {for(int j=0;j<8;j++)printf(s[2*i][j]==1?"*":" ");for(int j=0;j<8;j++)printf(s[2*i+1][j]==1?"*":" ");printf("\n");}return 0; } 通過程序運行得到題目:"九的九次方等于多少?"然后在電腦上隨便找個計算器,得到答案:387420489.
第三道題好像是題目給出100個數,求它們的乘積末尾有幾個零。看一下這些數的范圍,都是三位或四位數,所以算乘積肯定算不出來。不知是不是個套路(至少我以前沒有想到或是看到過,可能我讀書太少吧),仔細一想,乘積末尾是0不就是能被十整除嗎,而10都是通過2*5得到的,所以只需要知道這100個數中因子2和5的個數,其中較小的那個數應該就是答案了。代碼如下: #include <iostream> #include <cstdio>using namespace std;int main() {int five=0,two=0;for(int i=0;i<100;i++) {int num;scanf("%d",&num);while(num%5==0) {five++;num/=5;}while(num%2==0) {two++;num/=2;}}printf("two=%d\nfive=%d\n",two,five);return 0; } 數據記不清了,所以具體答案就不說了。
第四題是個x星球人摔手機的問題,本人很菜,硬是沒讀懂這道題到底是什意思,答案也是隨手填的,有大佬會這道題的可以帶我一下。 第五題代碼填空,好像是求一個集合里第k小的數是幾,填空部分是快速排序的遞歸部分的四個參數,代碼記不清了,反正也不是很難,答案就先跳過吧。
第六題題意很簡單:大概是說從A,B,C三個數組中各選一個數字a,b,c,使a<b<c,這樣的選法有幾種。我的想法也很簡單:先分別對A數組,B數組,C數組進行排序,排好后對B組中的元素逐一遍歷,到A中找小于B中的這個元素的數的個數,到C中找大于B中的這個元素的數的個數,得到的兩個結果相乘,最后對乘積結果求和就得到答案啦。代碼如下: #include <iostream> #include <cstdio> #include <algorithm>using namespace std;const int maxn=100000; int A[maxn],B[maxn],C[maxn];int main() {int n;scanf("%d",&n);for(int i=0;i<n;i++) {scanf("%d",&A[i]);}sort(A,A+n);for(int i=0;i<n;i++) {scanf("%d",&B[i]);}sort(B,B+n);for(int i=0;i<n;i++) {scanf("%d",&C[i]);}sort(C,C+n);int sum=0;for(int i=0;i<n;i++) {int j;for(j=0;j<n;j++) {if(A[j]>=B[i])break;}int sum1=j;for(j=n-1;j>=0;j--) {if(C[j]<=B[i])break;}int sum2=n-j-1;sum+=(sum1*sum2);}printf("%d",sum);return 0; } 第七題求平面上從原點開始經過彎彎曲曲的折線到達一個整點的距離。看了一眼,感覺是一道搜索題,然后看數據范圍貌似有點大,又看第二眼我就考慮著這題會不會是簡單的數學公式。經過一番分析后,我發現好像真能用數學公式分情況計算出答案,只是不是太簡單。先比較一下輸入的橫、縱坐標的絕對值,分|x|>|y|和|x|<=|y|兩種情況。然后按x的正負,y的正負進行討論得求值公式。根據圖形中的橫線和豎線可以看出公式應該是[(1+2+3+……+m)+(1+2+3+……+n)+k](其中m,n和點所在的邊是上下左右有關,k是最后一條邊拐角處到要求點的距離,前兩項是等差數列的和)。代碼如下:
#include <iostream> #include <cstdio> #include <cmath>using namespace std;long long dis(int x,int y) {int m=abs(x);int n=abs(y);if(m>n) {if(x<0) {long long num=(long long)(2*m-1);long long dx=(num+1)*num/2;long long dy=(num-1)*num/2;long long d=(long long)(y-x-1);return (dx+dy+d);}else {long long num=(long long)(2*m);long long dx=(num+1)*num/2;long long dy=(num-1)*num/2;long long d=(long long)(x-y);return (dx+dy+d);}}else {if(y<=0) {long long num=(long long)(2*n);long long dx=(num+1)*num/2;long long dy=(num+1)*num/2;long long d=(long long)(-y-x);return (dx+dy+d);}else {long long num=(long long)(2*m-1);long long dx=(num+1)*num/2;long long dy=(num+1)*num/2;long long d=(long long)(x+y);return (dx+dy+d);}} }int main() {int x,y;scanf("%d%d",&x,&y);printf("%lld",dis(x,y));return 0; } 寫的亂七八糟,不知道對與不對。 前面的題浪費的時間太多了(也可能是智商跟不上),后面三道題就沒有時間了,離考試結束還有二十分鐘的時候瞥了一眼后面的三道題,第九個好像是個搜索的題目(日常惡心),不過好像不是太難,然后開始寫,最后還是沒寫完。。。
第一道簽到題,2000年1月1日是第一天,5月4日是第幾天。這道題沒有寫代碼,直接草稿紙手算,需要注意二月有29天。31+29+31+30+4=125,不知對不對。有大佬直接用Excel做出來了,看來我還是技不如人啊。 第二道題貌似有點難度了,反正我一眼沒看懂,后來明白了,題意大概是:漢字字形可以用16*16的像素表示,每個像素有兩種狀態,對應二進制數0和1,于是一個漢字就可以用256位二進制數表示,也就是32個字節。題目給出的是十組數據表示十個漢字的字形,每組數據為32個帶符號十進制數(對應八位二進制數,符號位為第一位),題目嘛,就是這十個字組成的一句話。首先寫個程序把漢字顯示出來:先把十進制數轉化為二進制,用個二維數組存儲,然后按條件打印出來好了。代碼如下: #include <iostream> #include <cstdio> #include <cmath>using namespace std;int s[32][8]={0};int main() {for(int i=0;i<32;i++) {int num;scanf("%d",&num);if(num<0) {s[i][0]=1;num=-num;}int temp=num;for(int j=7;j>0;j--) {s[i][j]=temp%2;temp/=2;}}for(int i=0;i<16;i++) {for(int j=0;j<8;j++)printf(s[2*i][j]==1?"*":" ");for(int j=0;j<8;j++)printf(s[2*i+1][j]==1?"*":" ");printf("\n");}return 0; } 通過程序運行得到題目:"九的九次方等于多少?"然后在電腦上隨便找個計算器,得到答案:387420489.
第三道題好像是題目給出100個數,求它們的乘積末尾有幾個零。看一下這些數的范圍,都是三位或四位數,所以算乘積肯定算不出來。不知是不是個套路(至少我以前沒有想到或是看到過,可能我讀書太少吧),仔細一想,乘積末尾是0不就是能被十整除嗎,而10都是通過2*5得到的,所以只需要知道這100個數中因子2和5的個數,其中較小的那個數應該就是答案了。代碼如下: #include <iostream> #include <cstdio>using namespace std;int main() {int five=0,two=0;for(int i=0;i<100;i++) {int num;scanf("%d",&num);while(num%5==0) {five++;num/=5;}while(num%2==0) {two++;num/=2;}}printf("two=%d\nfive=%d\n",two,five);return 0; } 數據記不清了,所以具體答案就不說了。
第四題是個x星球人摔手機的問題,本人很菜,硬是沒讀懂這道題到底是什意思,答案也是隨手填的,有大佬會這道題的可以帶我一下。 第五題代碼填空,好像是求一個集合里第k小的數是幾,填空部分是快速排序的遞歸部分的四個參數,代碼記不清了,反正也不是很難,答案就先跳過吧。
第六題題意很簡單:大概是說從A,B,C三個數組中各選一個數字a,b,c,使a<b<c,這樣的選法有幾種。我的想法也很簡單:先分別對A數組,B數組,C數組進行排序,排好后對B組中的元素逐一遍歷,到A中找小于B中的這個元素的數的個數,到C中找大于B中的這個元素的數的個數,得到的兩個結果相乘,最后對乘積結果求和就得到答案啦。代碼如下: #include <iostream> #include <cstdio> #include <algorithm>using namespace std;const int maxn=100000; int A[maxn],B[maxn],C[maxn];int main() {int n;scanf("%d",&n);for(int i=0;i<n;i++) {scanf("%d",&A[i]);}sort(A,A+n);for(int i=0;i<n;i++) {scanf("%d",&B[i]);}sort(B,B+n);for(int i=0;i<n;i++) {scanf("%d",&C[i]);}sort(C,C+n);int sum=0;for(int i=0;i<n;i++) {int j;for(j=0;j<n;j++) {if(A[j]>=B[i])break;}int sum1=j;for(j=n-1;j>=0;j--) {if(C[j]<=B[i])break;}int sum2=n-j-1;sum+=(sum1*sum2);}printf("%d",sum);return 0; } 第七題求平面上從原點開始經過彎彎曲曲的折線到達一個整點的距離。看了一眼,感覺是一道搜索題,然后看數據范圍貌似有點大,又看第二眼我就考慮著這題會不會是簡單的數學公式。經過一番分析后,我發現好像真能用數學公式分情況計算出答案,只是不是太簡單。先比較一下輸入的橫、縱坐標的絕對值,分|x|>|y|和|x|<=|y|兩種情況。然后按x的正負,y的正負進行討論得求值公式。根據圖形中的橫線和豎線可以看出公式應該是[(1+2+3+……+m)+(1+2+3+……+n)+k](其中m,n和點所在的邊是上下左右有關,k是最后一條邊拐角處到要求點的距離,前兩項是等差數列的和)。代碼如下:
#include <iostream> #include <cstdio> #include <cmath>using namespace std;long long dis(int x,int y) {int m=abs(x);int n=abs(y);if(m>n) {if(x<0) {long long num=(long long)(2*m-1);long long dx=(num+1)*num/2;long long dy=(num-1)*num/2;long long d=(long long)(y-x-1);return (dx+dy+d);}else {long long num=(long long)(2*m);long long dx=(num+1)*num/2;long long dy=(num-1)*num/2;long long d=(long long)(x-y);return (dx+dy+d);}}else {if(y<=0) {long long num=(long long)(2*n);long long dx=(num+1)*num/2;long long dy=(num+1)*num/2;long long d=(long long)(-y-x);return (dx+dy+d);}else {long long num=(long long)(2*m-1);long long dx=(num+1)*num/2;long long dy=(num+1)*num/2;long long d=(long long)(x+y);return (dx+dy+d);}} }int main() {int x,y;scanf("%d%d",&x,&y);printf("%lld",dis(x,y));return 0; } 寫的亂七八糟,不知道對與不對。 前面的題浪費的時間太多了(也可能是智商跟不上),后面三道題就沒有時間了,離考試結束還有二十分鐘的時候瞥了一眼后面的三道題,第九個好像是個搜索的題目(日常惡心),不過好像不是太難,然后開始寫,最后還是沒寫完。。。
? ? ? ? 個人感覺這次比賽并沒有幾個算法題目(至少前七題是這樣),但是今后還是要好好學算法吶,不然智商就真的蹭蹭地下降了。。。真希望這次比賽能拿個獎,然后,沒有然后了,來年再戰,吼吼。
總結
以上是生活随笔為你收集整理的2018年第九届蓝桥杯大赛软件类省赛C/C++B组参赛感想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南方航空认沽权证21日上市 初始行权价为
- 下一篇: Dummy Sample