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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

第十二届蓝桥杯大赛软件赛省赛第二场【C++B组】

發布時間:2025/3/20 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第十二届蓝桥杯大赛软件赛省赛第二场【C++B组】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自己參加的是第一次場的,打的很爛。做了一下第二場的題,我是真想罵街。
第二場普遍簡單許多。

目錄

  • A: 求余 【簽到】
  • B: 雙階乘 【簽到】
  • C: 格點 【簽到題】
  • D: 整數分解 【DP】
  • E: 城邦 【最小生成樹板子題】
  • F: 特殊年份 【簽到題】
  • G: 小平方 【簽到題】
  • H: 完全平方數 【質因子分解】
  • I: 負載均衡 【優先隊列 / 模擬】
  • J: 國際象棋 【狀壓DP / 水平有限不會寫】

A: 求余 【簽到】


答案: 1

#include<cstdio> #include<iostream> using namespace std; int main(void) {cout<<2021%20<<endl;return 0; }

B: 雙階乘 【簽到】


答案: 59375

#include<cstdio> #include<iostream> using namespace std; int main(void) {long long int ans=1;for(int i=2021;i>=1;i=i-2){ans*=i;ans=ans%100000;}cout<<ans<<endl;return 0; }

C: 格點 【簽到題】


答案: 15698

#include<cstdio> #include<iostream> using namespace std; int main(void) {int ans=0;for(int i=1;i<=2021;i++){for(int j=1;j<=2021;j++){if(i*j<=2021) ans++;}}cout<<ans<<endl;return 0; }

D: 整數分解 【DP】


答案: 691677274345
f[i][j] 表示將數字j分成i份有多少種方法

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; long long int f[6][2025]; int main(void) {for(int i=1;i<=2021;i++) f[1][i]=1;for(int i=2;i<=5;i++){for(int j=1;j<=2021;j++){for(int k=1;k<=2021;k++){if(j-k>=1) f[i][j]+=f[i-1][j-k];}}}cout<<f[5][2021];return 0; }

E: 城邦 【最小生成樹板子題】


答案: 4046

自己求一下每一條邊的權,用最小生成樹模板就OK了。

#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=2022; const int INF=0x3f3f3f3f; int g[N][N],dist[N]; bool st[N]; int n,m; int prim() {memset(dist,0x3f,sizeof dist);int res=0;for(int i=0;i<n;i++){int t=-1;for(int j=1;j<=n;j++)if(!st[j]&&(t==-1 || dist[t] > dist[j] )) t=j;st[t]=true;if(i) res+=dist[t];if(i&&dist[t]==INF) return INF;for(int j=1;j<=n;j++) dist[j]=min(dist[j],g[t][j]);}return res; } int main(void) {cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j) g[i][j]=0;else g[i][j]=INF;}}for(int i=1;i<=2021;i++){for(int j=1;j<=2021;j++){if(i!=j){int a=i,b=j;int sum=0;while(a||b){if(a%10!=b%10) sum+=a%10+b%10;a/=10,b/=10;}g[i][j]=sum;g[j][i]=sum;}}}int t=prim();cout<<t<<endl;return 0; }

F: 特殊年份 【簽到題】

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int ans; bool check(int x) {int a=x/1000;int b=(x/100)%10;int c=(x/10)%10;int d=x%10;if(a==c&&(d-b==1)) return true;else return false; } int main(void) {int x;for(int i=0;i<5;i++){cin>>x;if(check(x)) ans++;} cout<<ans<<endl;return 0; }

G: 小平方 【簽到題】

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int main(void) {int n; cin>>n;double a=n/2.0;int ans=0;for(int i=1;i<=n-1;i++){int temp=i*i;if((temp%n)<a) ans++;}cout<<ans<<endl;return 0; }

H: 完全平方數 【質因子分解】


解析: 你要知道,要想可以開平方,其質因子必須成對出現。不是偶數的補一下就好了。
例如: 12=2x2x3 , 3的個數是一個,不是偶數所以得補一個3 結果 12x3=36 就可以開平方了。
注意: 本題數據范圍大要用 long long 可能會有一個很大的質數的情況。

#include<cstdio> #include<iostream> #include<algorithm> #include<map> using namespace std; map<long long int,long long int> mp; int main(void) {long long int x; cin>>x;for(int i=2;i<=x/i;i++){while(x%i==0) mp[i]++,x/=i;}if(x!=1) mp[x]++;long long int ans=1;for(map<long long int,long long int>::iterator it=mp.begin();it!=mp.end();it++){long long int temp=it->second;if(temp&1) ans*=it->first;}cout<<ans<<endl;return 0; }

I: 負載均衡 【優先隊列 / 模擬】


用優先隊列來維護當前時間哪一個機器的任務完成了,釋放資源。

#include<cstdio> #include<iostream> #include<algorithm> #include<queue> using namespace std; const int N=1e5*2+10; struct machine {int id;//機器int sum;//算力int end;//結束的時間friend bool operator < (machine f1,machine f2)//時間從小到大{return f1.end > f2.end;} }stu; int sum[N];//每臺計算機的當前可用的算力 int n,m; int main(void) {cin>>n>>m;priority_queue<machine> heap;for(int i=1;i<=n;i++) scanf("%d",&sum[i]);while(m--){bool flag=false;int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d);while(heap.size())//判斷可不可以釋放算力{auto t=heap.top();if(t.end<=a) {heap.pop();sum[t.id]+=t.sum; }else break;}if(sum[b]>=d)//可以計算{stu.id=b,stu.sum=d,stu.end=a+c;heap.push(stu);sum[b]-=d;cout<<sum[b]<<endl;flag=true;}if(!flag) cout<<-1<<endl;} }

J: 國際象棋 【狀壓DP / 水平有限不會寫】

總結

以上是生活随笔為你收集整理的第十二届蓝桥杯大赛软件赛省赛第二场【C++B组】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。