生活随笔
收集整理的這篇文章主要介紹了
2021第十二届蓝桥杯大赛软件赛省赛C++ B组真题题解
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
==========================================
2019-2021藍(lán)橋杯C++ B組真題題解:
2019第十屆藍(lán)橋杯大賽軟件類(lèi)省賽C++ B組真題題解
2020第十一屆藍(lán)橋杯大賽軟件類(lèi)省賽第二場(chǎng)C++ B組真題題解
2021第十二屆藍(lán)橋杯大賽軟件賽省賽C++ B組真題題解
==========================================
目錄
- 試題A:空間(5分)
- 試題B:卡片(5分)
- 試題C:直線(10分)
- 試題D:貨物擺放(10分)
- 試題E:路徑(15分)
- 試題F:時(shí)間顯示(15分)
- 試題G:砝碼稱(chēng)重(20分)
- 試題H:楊輝三角形(20分)
- 試題I:雙向排序(25分)
- 試題J:括號(hào)序列(25分)
試題A:空間(5分)
題目分析:
1MB=1024*1024B,1B=8位
題目代碼:
#include <iostream>
using namespace std
;
int main()
{cout
<<256*1024*1024/4<<endl
;
}
題目答案:
67108864
試題B:卡片(5分)
題目分析:
因?yàn)閺?開(kāi)始,所以1是用到最多的卡片,我們可以從1枚舉,直到有2021個(gè)1
題目代碼:
#include <iostream>
using namespace std
;
int tot_1
=2021;
void cal(int i
)
{while(i
>0){if(i
%10==1)tot_1
--;i
=i
/10;}
}
int main()
{int i
=1;while(1){cal(i
);if(tot_1
<=0)break;i
++;}cout
<<"tot_1:"<<tot_1
<<" i:"<<i
<<endl
;return 0;
}
題目答案:
3181
試題C:直線(10分)
題目分析:
枚舉所有兩個(gè)點(diǎn)的情況,然后利用直線公式 y=kx+b 求出k、b,利用結(jié)構(gòu)體將k、b放入set集合,求出唯一直線的數(shù)量
注意:
1.k值為0或者無(wú)窮需要另外計(jì)算
2. b = (X2 * Y1-X1*Y2)/(X2-X1)
題目代碼:
#include <bits/stdc++.h>
using namespace std
;
struct Point {int x
,y
;Point() {}Point(int xx
,int yy
):x
{xx
},y
{yy
} {}
};
struct Line {double k
,b
;Line() {}Line(double kk
,double bb
):k
{kk
},b
{bb
} {}bool operator<(const Line
&l
)const{if(k
==l
.k
)return b
<l
.b
;return k
<l
.k
;}
};
Point points
[425];
set
<Line
> Lines
;
void cal(Point a1
,Point a2
) {if(a2
.x
==a1
.x
||a2
.y
==a1
.y
)return;int bottom
=a2
.x
-a1
.x
;int top
=a2
.y
-a1
.y
;double k
=top
*1.0/bottom
;double b
=(a2
.x
*a1
.y
-a1
.x
*a2
.y
)*1.0/bottom
;Lines
.insert(Line(k
,b
));
}
int main() {int n
=0;for(int x
=0; x
<20; x
++) {for(int y
=0; y
<21; y
++) {points
[n
].x
=x
;points
[n
].y
=y
;n
++;}}for(int i
=0; i
<420; i
++) {for(int j
=i
+1; j
<420; j
++) {cal(points
[i
],points
[j
]);}}cout
<<Lines
.size()+20+21<<endl
;
}
題目答案:
40257
試題D:貨物擺放(10分)
題目分析:
這道題主要考分解質(zhì)因數(shù)
2021041820210418=2*3*3*3*17*131*2857* 5882353
排列組合:35 *(1+2+2+2+3)=2430 【因?yàn)橛?個(gè)3】
題目代碼:
#include <bits/stdc++.h>
using namespace std
;
int main()
{long long n
;cin
>>n
;long long m
=n
;for(long long i
=2;i
<n
/2;i
++){if(m
%i
==0){cout
<<i
<<"*";m
/=i
;i
--;}}return 0;
}
題目答案:
2430
試題E:路徑(15分)
題目分析:
方法一:比較簡(jiǎn)單,相當(dāng)于枚舉的方法
從1到2021進(jìn)行尋找每個(gè)的最短的路徑,我想的是多循環(huán)幾次看結(jié)果的變化,但是沒(méi)想到第一次就是正確的結(jié)果
注:n*i/__gcd(n,i) 是求最小公倍數(shù)
細(xì)節(jié)參考:C++ 一行代碼解決最大公約數(shù)和最小公倍數(shù)
題目代碼:
#include <bits/stdc++.h>
using namespace std
;
int num
[2022];
void fun(int n
)
{int left
=n
-21,right
=n
+21;if(n
-21<=0){left
=1;}else if(n
+21>2021){right
=2021;}for(int i
=left
;i
<=right
;i
++){num
[n
]=min(n
*i
/__gcd(n
,i
)+num
[i
],num
[n
]); }
}
int main()
{for(int i
=1;i
<=2021;i
++)num
[i
]=100000000;num
[1]=0;for(int j
=1;j
<10;j
++){for(int i
=1;i
<=2021;i
++){fun(i
);}cout
<<num
[2021]<<endl
;}
}
題目答案:
10266837
試題F:時(shí)間顯示(15分)
題目分析:
只要記清時(shí)間的換算單位即可
題目代碼:
#include <iostream>
using namespace std
;
#define Day 86400000
int main()
{long int time
;cin
>>time
;time
=time
%Day
;int Hour
,minute
,second
;Hour
=time
/(60*60*1000);time
=time
%(60*60*1000);minute
=time
/(60*1000);time
=time
%(60*1000);second
=time
/1000;printf("%02d:%02d:%02d",Hour
,minute
,second
);return 0;
}
試題G:砝碼稱(chēng)重(20分)
題目分析:
題目代碼:
#include <iostream>
using namespace std
;
int dp
[105][100005];
int weight
[105];
int main()
{int N
,sum
=0;cin
>>N
;for(int i
=1;i
<=N
;i
++){cin
>>weight
[i
];sum
+=weight
[i
];}for(int i
=1;i
<=N
;i
++){for(int j
=1;j
<=sum
;j
++){dp
[i
][j
]=dp
[i
-1][j
];if(!dp
[i
][j
]){if(weight
[i
]==j
)dp
[i
][j
]=1;if(dp
[i
-1][abs(j
-weight
[i
])])dp
[i
][j
]=1;if(dp
[i
-1][j
+weight
[i
]])dp
[i
][j
]=1;}}}long long res
=0;for(int i
=1;i
<=sum
;i
++){if(dp
[N
][i
])res
++;}cout
<<res
<<endl
;return 0;
}
試題H:楊輝三角形(20分)
題目分析:
題目代碼:
#include <bits/stdc++.h>
using namespace std
;
long long int n
;
long long int C(long long int a
, long long int b
) {long long int ret
= 1;for (long long int i
= a
, j
= 1; j
<= b
; i
--, j
++) {ret
= ret
* i
/ j
;if (ret
> n
) {return n
+ 1;}}return ret
;
}
long long getAns(int col
)
{long long l
=col
,r
=max((long long)col
,n
);while(l
<r
){long long mid
=(l
+r
)/2; if(C(mid
,col
)>=n
){r
=mid
;}else{l
=mid
+1;}}if(C(l
,col
)==n
){return l
*(l
+1)/2+col
+1;}else{return 4e18;}
}
int main()
{cin
>>n
;if(n
==1){cout
<<"1"<<endl
;return 0;}long long res
=4e18;for(int i
=0;i
<=20;i
++){res
=min(res
,getAns(i
));}cout
<<res
<<endl
;
}
試題I:雙向排序(25分)
題目分析:
題目代碼:
試題J:括號(hào)序列(25分)
題目分析:
題目代碼:
總結(jié)
以上是生活随笔為你收集整理的2021第十二届蓝桥杯大赛软件赛省赛C++ B组真题题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。