日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

2021第十二届蓝桥杯大赛软件赛省赛C++ B组真题题解

發(fā)布時(shí)間:2023/12/18 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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=(a1.y-k*a1.x)*1.0;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)//尋找一個(gè)位置的最短路徑(更新) {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;//進(jìn)行初始化num[1]=0;for(int j=1;j<10;j++)//循環(huán)10次看結(jié)果{for(int i=1;i<=2021;i++){fun(i);}cout<<num[2021]<<endl;//查看結(jié)果} }

題目答案:

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; //求取某個(gè)點(diǎ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)//二分法求某一行是否有等于n的數(shù) {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;//等差數(shù)列求和 }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++)//枚舉20列 {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ò),歡迎將生活随笔推薦給好友。