第四届“传智杯”全国大学生IT技能大赛(决赛B组)【题解】
生活随笔
收集整理的這篇文章主要介紹了
第四届“传智杯”全国大学生IT技能大赛(决赛B组)【题解】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
感覺都是暴力題或者類似原題,就是手速場。
目錄
- A. 小智的疑惑
- B. 三元組
- C. 排排隊
- D. 背單詞的小智
- F1. 生活在樹上(easy version)
A. 小智的疑惑
比賽的時候寫的KMP,數組開小了wa了一下。
其實暴力就行。
B. 三元組
#include<bits/stdc++.h> using namespace std; const int N=110; int t,n,a[N]; int main(void) {cin>>t;while(t--){cin>>n;for(int i=0;i<n;i++) cin>>a[i];int cnt=0;for(int i=0;i<n;i++)for(int j=i;j<n;j++)for(int k=j;k<n;k++)if( (i<=j) && (j<=k) && (a[i]+a[j]==a[k]) ) cnt++;cout<<cnt<<endl;}return 0; }C. 排排隊
模擬即可。
#include<bits/stdc++.h> using namespace std; int t,n,x; int main(void) {cin>>t;while(t--){vector<int>a,b;vector<pair<int,int>>ans;cin>>n;for(int i=0;i<n;i++) cin>>x,a.push_back(x);for(int i=0;i<n;i++) cin>>x,b.push_back(x);for(int i=0;i<n;i++){if(a[i]!=b[i]){int j=i;while(j<a.size()&&a[j]!=b[i]) j++;//找到第一個相等的位置if(j<a.size()){while(j>i)//一直交換{swap(a[j-1],a[j]);ans.push_back({j-1,j});j--;}}}}if(a==b){puts("YES");for(int i=0;i<ans.size();i++) cout<<ans[i].first+1<<" "<<ans[i].second+1<<endl;puts("0 0");}else puts("NO");}return 0; }D. 背單詞的小智
就是二分,挺常規的。
#include<bits/stdc++.h> using namespace std; typedef unsigned long long int LL; const int N=1e5*3+10; LL a[N],n,k,sum; bool check(LL x) {LL cnt=0,sum=0;for(int i=1;i<=n;i++){if(a[i]*a[i]>x) return false;if(sum+a[i]*a[i]>x){sum=a[i]*a[i];cnt++;}else sum+=a[i]*a[i];}return cnt+1<=k; } int main(void) {cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i]*a[i];LL l=0,r=sum;while(l<r){LL mid=l+r>>1;if(check(mid)) r=mid;else l=mid+1;}cout<<l;return 0; }F1. 生活在樹上(easy version)
思維題,我們這里假設1為根,就是看a,b到根結點的 dist[a]^dist[b]是不是k
注意開大點就行。
總結
以上是生活随笔為你收集整理的第四届“传智杯”全国大学生IT技能大赛(决赛B组)【题解】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 101. 最高的牛【差分 思维】
- 下一篇: Acwing第 42 场周赛【完结】