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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2021 RoboCom 世界机器人开发者大赛-本科组(初赛)【完结】

發(fā)布時(shí)間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021 RoboCom 世界机器人开发者大赛-本科组(初赛)【完结】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

看群友在水這個(gè)比賽玩玩,于是也去打了一下重現(xiàn)賽。
事實(shí)證明,群友輕松AK,而我只會(huì)暴力。
總的難度就是PAT甲的難度吧,數(shù)據(jù)很不錯(cuò),惡心的一批。
補(bǔ)題完結(jié)

2021RoboCom機(jī)器人開發(fā)者大賽官方題解

目錄

  • 7-1 懂的都懂 (20 分)【簡單 / 暴力 + 哈希表】
  • 7-2 芬蘭木棋 (25 分)【中 / map 貪心】
  • 7-3 打怪升級(jí) (25 分) 【中 / 最短路 記得維護(hù)值 和 存路徑】
  • 7-4 疫情防控 (30 分)【難度: 難 / 并查集 思維】

7-1 懂的都懂 (20 分)【簡單 / 暴力 + 哈希表】

方法一: 自己的傻叉做法 預(yù)處理所有的4個(gè)數(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; }

方法二: 只需處理所有的四個(gè)數(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 貪心】

大木棋會(huì)打倒這個(gè)方向上離哲哲最近的 k 個(gè)小木棋
讀了半天的假題。

1 1 1 2 2 2 3 3 1 步數(shù)為3 先打123 #include<bits/stdc++.h> using namespace std; typedef long long LL; LL ans,n,cnt; LL gcd(LL a,LL b) {return b?gcd(b,a%b):a;} map<pair<LL,LL>,vector< pair<LL,LL> > >mp;//斜率映射到對(duì)應(yīng)的距離加分?jǐn)?shù) int main(void) {cin>>n;for(int i=1;i<=n;i++){LL x,y,c; cin>>x>>y>>c;ans+=c;LL temp=gcd(abs(x),abs(y));mp[{x/temp,y/temp}].push_back({x*x+y*y,c}); //注意: 距離必須是x*x+y*y 單獨(dú)的x是不行的因?yàn)檫€有y軸上的點(diǎn)}cnt=0;for(auto i=mp.begin();i!=mp.end();i++)//枚舉所有的方向{auto ve=i->second;sort(ve.begin(),ve.end());//距離排序for(int j=0;j<ve.size();j++){if(ve[j].second!=1) {cnt++;if(j-1>=0&&ve[j-1].second==1) cnt++;}}if(ve[ve.size()-1].second==1) cnt++;}cout<<ans<<" "<<cnt;return 0; }

7-3 打怪升級(jí) (25 分) 【中 / 最短路 記得維護(hù)值 和 存路徑】

寫的可以過,不過有點(diǎn)太卡時(shí)間。

#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存的是該點(diǎn)最大的價(jià)值,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);//每一個(gè)點(diǎn)跑一下最短路,找到最短路中最大的值,最小的值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; }

正解: 考慮將所有操作離線,逆序處理。即,先刪除要?jiǎng)h除的所有點(diǎn),再倒著往里加點(diǎn),順便把詢問處理掉,用并查集維護(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;//添加點(diǎn)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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。