2022 RoboCom 世界机器人开发者大赛-本科组(国赛)
目录
RC-u1 智能红绿灯
RC-u2 女王的大敕令
RC-u3 战利品分配
RC-u5 养老社区
RC-u1 智能红绿灯
模拟题。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;int main()
{int n;cin>>n;vector<int> v(n);for(auto &t:v) cin>>t;vector<pair<int,int>> res;int l=v[0]+15,r=v[0]+44;int cnt=0;for(int i=1;i<n;i++){if(v[i]>r){cnt=0;res.push_back({l,r});l=v[i]+15,r=v[i]+44;}else if(v[i]>=l&&v[i]<=r){if(!cnt){cnt=1;r+=15;}}}res.push_back({l,r});for(auto [a,b]:res) cout<<a<<' '<<b<<endl;
}
RC-u2 女王的大敕令
数据量太小了,直接爆搜。
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
using namespace std;int d[4];
int c1,c2,r1,r2;
int ex,ey,d1,d2;
int k,xx,yy,sx,sy;
int ne[4][2]={{1,-1},{1,1},{-1,1},{-1,-1}};
map<pair<int,int>,set<pair<int,int>>> mp;
struct node{int x1,y1,x2,y2;
}tr[100000];
bool ok(int x,int y)
{if(x>=1&&x<=5&&y>=1&&y<=5) return true;return false;
}
void dfs(int x,int y,int cnt)
{if(cnt==1){int dong=r2+d[3];int xi=r1-d[2];if(x==dong||xi==x||y==c1||y==c2) return ;for(int i=0;i<=d1;i++){int j=d1-i;for(int jj=0;jj<4;jj++){int xx=x+ne[jj][0]*i,yy=y+ne[jj][1]*j;if(ok(xx,yy))dfs(xx,yy,2);}}}else if(cnt==2){int dong=r2+d[3];int xi=r1-d[2];int nan=c2-d[1];int bei=c1+d[0];// cout<<x<<' '<<y<<endl;if(x==dong||x==xi||y==nan||y==bei) return ;for(int i=0;i<=d2;i++){int j=d2-i;for(int jj=0;jj<4;jj++){int xx=x+ne[jj][0]*i,yy=y+ne[jj][1]*j;if(ok(xx,yy)&&xx==ex&&ey==yy){mp[{sx,sy}].insert({x,y});}}}}
}
int main()
{cin>>c1>>c2>>r1>>r2;for(int i=0;i<4;i++) cin>>d[i];cin>>ex>>ey>>d1>>d2;for(int i=1;i<=5;i++){for(int j=1;j<=5;j++){// cout<<"----"<<sx<<' '<<sy<<endl;sx=i,sy=j;dfs(i,j,1);}}#define fi first#define se secondfor(auto [a,b]:mp){for(auto [a1,b1]:b)tr[k++]={a.fi,a.se,a1,b1};}sort(tr,tr+k,[](node a,node b){return a.x1<b.x1||(a.x1==b.x1&&a.y1<b.y1);});for(int i=0;i<k;i++)cout<<tr[i].x1<<' '<<tr[i].y1<<' '<<tr[i].x2<<' '<<tr[i].y2<<endl;
}
RC-u3 战利品分配
PTA就是喜欢考这类很板的条件判断Dijkstra
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<array>
#define int long long
using namespace std;
using aii=array<int,4>;
const int N = 1e5+5;vector<int> e[N];
int p[N];
int K,P,n,m,s,d;
int ma[N];
int maxn;void Dijkstra()
{vector<int> dist(n+1,1e18);dist[s]=0;priority_queue<aii,vector<aii>,greater<aii>> heap;ma[s]=p[s];heap.push({0,(P==1?p[s]:0),1,s});while(heap.size()){auto [dis,sum,cnt,t]=heap.top();heap.pop();if(dist[t]<dis) return ;if(t==d){if(dist[t]<dis) return ;if(dist[t]==dis){if(maxn<sum) maxn=sum;}}cnt=(cnt+1)%K;if(cnt==0) cnt=K;for(int j:e[t]){if(dist[j]>dis+1){dist[j]=dis+1;int sum1=sum;if(cnt==P) sum1=sum+p[j];ma[j]=sum1;heap.push({dist[j],sum1,cnt,j});}else if(dist[j]==dis+1){int sum1=sum;if(cnt==P) sum1=sum+p[j];if(sum1>ma[j]){ma[j]=sum1;heap.push({dist[j],sum1,cnt,j});}}}}}
int32_t main()
{cin>>n>>m>>K>>P;for(int i=1;i<=n;i++) cin>>p[i];for(int i=1;i<=m;i++){int a,b;cin>>a>>b;e[a].emplace_back(b);e[b].emplace_back(a);}cin>>s>>d;Dijkstra();cout<<maxn;
}
RC-u5 养老社区
先用bfs算出任意两点之间的距离,再枚举三个点看是否满足距离相等,本质不同。
#include<iostream>
#include<queue>
#include<cstring>using namespace std;const int N = 2005;int dist[N][N],t[N];
bool st[N];
int n;
vector<int> e[N];void bfs(int s)
{queue<int> q;q.push(s);while(q.size()){auto it=q.front();q.pop();for(auto v:e[it]){if(!dist[s][v]){dist[s][v]=dist[s][it]+1;q.push(v);}}}
}
int main()
{cin>>n;for(int i=1;i<n;i++){int a,b;cin>>a>>b;e[a].push_back(b);e[b].push_back(a);}for(int i=1;i<=n;i++) cin>>t[i];for(int i=1;i<=n;i++){memset(st,false,sizeof st);bfs(i);}int cnt=0;for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)for(int k=j+1;k<=n;k++){if(dist[i][j]==dist[j][k]&&dist[i][j]==dist[i][k]){if(t[i]!=t[j]&&t[i]!=t[k]&&t[k]!=t[j])cnt++;}}cout<<cnt;
}