2021 RoboCom 世界机器人开发者大赛-本科组(初赛)【完结】
生活随笔
收集整理的這篇文章主要介紹了
2021 RoboCom 世界机器人开发者大赛-本科组(初赛)【完结】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
看群友在水這個比賽玩玩,于是也去打了一下重現(xiàn)賽。
事實證明,群友輕松AK,而我只會暴力。
總的難度就是PAT甲的難度吧,數(shù)據(jù)很不錯,惡心的一批。
補(bǔ)題完結(jié)
2021RoboCom機(jī)器人開發(fā)者大賽官方題解
目錄
- 7-1 懂的都懂 (20 分)【簡單 / 暴力 + 哈希表】
- 7-2 芬蘭木棋 (25 分)【中 / map 貪心】
- 7-3 打怪升級 (25 分) 【中 / 最短路 記得維護(hù)值 和 存路徑】
- 7-4 疫情防控 (30 分)【難度: 難 / 并查集 思維】
7-1 懂的都懂 (20 分)【簡單 / 暴力 + 哈希表】
方法一: 自己的傻叉做法 預(yù)處理所有的4個數(shù)的平均值。用double 注意精度
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,m; double a[N],b[N]; map<double,int>mp; int main(void) {scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%lf",&a[i]);for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){for(int k=j+1;k<n;k++){for(int z=k+1;z<n;z++){int temp=a[i]+a[j]+a[k]+a[z];mp[temp/4.0]++;}}}}while(m--){int t; scanf("%d",&t);bool flag=1;for(int i=0;i<t;i++) {scanf("%lf",&b[i]);if(!mp[b[i]]) flag=false;}if(flag) puts("Yes");else puts("No");}return 0; }方法二: 只需處理所有的四個數(shù)的和即可,不用求平均
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,m; int a[N],b[N]; map<int,int>mp; int main(void) {scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%d",&a[i]);for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){for(int k=j+1;k<n;k++){for(int z=k+1;z<n;z++){int temp=a[i]+a[j]+a[k]+a[z];mp[temp]++;}}}}while(m--){int t; scanf("%d",&t);bool flag=1;for(int i=0;i<t;i++) {scanf("%d",&b[i]);if(!mp[b[i]*4]) flag=false;}if(flag) puts("Yes");else puts("No");}return 0; }7-2 芬蘭木棋 (25 分)【中 / map 貪心】
大木棋會打倒這個方向上離哲哲最近的 k 個小木棋
讀了半天的假題。
7-3 打怪升級 (25 分) 【中 / 最短路 記得維護(hù)值 和 存路徑】
寫的可以過,不過有點太卡時間。
#pragma GCC optimize(3) #include<bits/stdc++.h> using namespace std; const int N=1e3+10; int n,m,t,x; int g[N][N],dist[N],st[N]; int startx,maxv=1e9; int p[N][N]; map<int,int>val,ans;//val存的是該點最大的價值,ans存路徑 void Dijkstra(int x) {memset(dist,0x3f,sizeof dist);memset(st,0,sizeof st);dist[x]=0;for(int i=0;i<n;i++){int t=-1;for(int j=1;j<=n;j++) if(!st[j]&&(t==-1 || dist[j]<dist[t] )) t=j;st[t]=1;for(int j=1;j<=n;j++){if(dist[j]>dist[t]+g[t][j]){dist[j]=dist[t]+g[t][j];val[j]=val[t]+p[t][j];ans[j]=t;}else if(dist[j]==dist[t]+g[t][j]){if(val[j]<val[t]+p[t][j]){val[j]=val[t]+p[t][j];ans[j]=t;}}}}int temp=0;for(int i=1;i<=n;i++) temp=max(temp,dist[i]);if(temp<maxv) maxv=temp,startx=x; } int main(void) {memset(g,0x3f,sizeof g);scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);g[a][b]=g[b][a]=c;p[a][b]=d,p[b][a]=d;}for(int i=1;i<=n;i++) Dijkstra(i);//每一個點跑一下最短路,找到最短路中最大的值,最小的值printf("%d\n",startx);val.clear(),ans.clear();Dijkstra(startx);scanf("%d",&t);while(t--){int x; scanf("%d",&x);int node=x;vector<int>path;while(node){path.push_back(node);node=ans[node];}for(int i=path.size()-1;i>=0;i--) {if(i!=path.size()-1) printf("->");printf("%d",path[i]);}printf("\n%d %d\n",dist[x],val[x]);}return 0; }7-4 疫情防控 (30 分)【難度: 難 / 并查集 思維】
很輕松的暴力做法騙22分
#include<bits/stdc++.h> using namespace std; const int N=1e5*3+10; int h[N],e[N],ne[N],idx; int st[N],vis[N]; int n,m,t; int startx,endx; bool flag; void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++;} void dfs(int u) {st[u]=1;if(u==endx&&!vis[u]) {flag=1;return;}for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j]&&!vis[j]) dfs(j);} } int main(void) {memset(h,-1,sizeof h);cin>>n>>m>>t;for(int i=0;i<m;i++){int a,b; cin>>a>>b;add(a,b),add(b,a);}while(t--){int c,q; cin>>c>>q;vis[c]=1;int ans=q;for(int i=0;i<q;i++){memset(st,0,sizeof st);flag=0;cin>>startx>>endx;if(!vis[startx])dfs(startx);if(flag) ans--;}cout<<ans<<endl;}return 0; }正解: 考慮將所有操作離線,逆序處理。即,先刪除要刪除的所有點,再倒著往里加點,順便把詢問處理掉,用并查集維護(hù)即可
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; typedef pair<int,int> PII; vector<int>ve[N];//存邊 vector<PII>vis[N]; int p[N],s[N],ans[N]; int n,m,t; int find(int x) {if(x!=p[x]) p[x]=find(p[x]);return p[x]; } int main(void) {cin>>n>>m>>t;for(int i=1;i<=n;i++) p[i]=i;for(int i=1;i<=m;i++){int a,b; cin>>a>>b;ve[a].push_back(b) ;ve[b].push_back(a);}for(int i=1;i<=t;i++){int k,a,b; cin>>s[i]>>k;p[s[i]]=0;//標(biāo)記為壞的 while(k--){cin>>a>>b;vis[i].push_back({a,b});}}for(int i=1;i<=n;i++){if(p[i]){for(int j=0;j<ve[i].size();j++){if(p[ve[i][j]]) p[find(i)]=find(ve[i][j]);}}}for(int i=t;i;i--){for(int j=0;j<vis[i].size();j++)//查詢{int fa=find(vis[i][j].first);int fb=find(vis[i][j].second);if(fa!=fb || fa==0 ) ans[i]++;}int k=s[i]; p[k]=k;//添加點for(int j=0;j<ve[k].size();j++)//并查集處理{if(p[ve[k][j]]) p[find(k)]=find(ve[k][j]);}}for(int i=1;i<=t;i++) cout<<ans[i]<<endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的2021 RoboCom 世界机器人开发者大赛-本科组(初赛)【完结】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1057 Stack (30 分)【难度
- 下一篇: 1059 Prime Factors (