2022 RoboCom 世界机器人开发者大赛-本科组(省赛)
Posted 小哈里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022 RoboCom 世界机器人开发者大赛-本科组(省赛)相关的知识,希望对你有一定的参考价值。
1、
题意:
- 忘了
思路:
- 扫一遍加起来,如果>m就从新计数,答案+1。
//AC
#include<bits/stdc++.h>
using namespace std;
int main()
int n, m; cin>>n>>m;
int sum = 0, cnt = 0;
for(int i = 1; i <= n; i++)
int x; cin>>x;
sum += x;
if(sum > m)
sum = x;
cnt++;
cout<<cnt<<"\\n";
return 0;
2、
题意:
- 忘了
思路:
- 无脑特判
//AC
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int a[maxn], last[maxn];
int main()
memset(last,-1,sizeof(last));
int n, m; cin>>n>>m;
for(int i = 1; i <= n; i++)
cin>>a[i];
while(m--)
int t, k; cin>>t>>k;
for(int i = 1; i <= k; i++)
int x; cin>>x;
if(last[x]==-1 || a[x]==-1 || t-last[x] >= a[x])
last[x] = t;
else
cout<<"Don't take "<<x<<" at "<<t<<"!\\n";
return 0;
3、
题意:
- 忘了
思路:
- 无脑特判
//AC
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int main()
map<int,int>mp;
string s; cin>>s;
s = s+"+";
int mx = 0, mi = 0;
int now = 0, last = 1;
int ok = 1;//jia
int dd = 0;
for(int i = 0; i < s.size(); i++)
if(s[i]=='d' || s[i]=='+' || s[i]=='-')
if(s[i]=='d')
if(now==0)now = 1;
last = now;
now = 0;
dd = 1;
else
if(dd==1)mp[now] += last;
if(dd==1)
if(ok==1)
mx += now*last;
mi += 1*last;
else
mi -= now*last;
mx -= 1*last;
else
if(ok==1)
mx += now;
mi += now;
else
mi -= now;
mx -= now;
if(s[i]=='+')ok = 1;
else ok = 0;
now = 0;
last = 0;
dd = 0;
else
now = now*10+s[i]-'0';
for(auto x : mp)
cout<<x.first<<" "<<x.second<<"\\n";
cout<<mi<<" "<<mx<<"\\n";
return 0;
4、
题意:
- 真忘了
思路:
- 继续无脑特判
- 翻车了21分不知道WA哪了,比赛开始二十多分钟的时候作为全场前五个开完T1235的人,保持rk1非常的快乐,,然鹅果然翻车,一直改不出特判看着排名一点点掉到了一百多(最后果然还是有一百多个人ak了,跟PAT一样熟悉的场景,上次好像也是九十几分一百多名)
//21/25分
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
int V[7]; string cz[7];
int mt, gb, zh; //主坦,工兵,智慧的总人数
vector<int>sc;//一个人两个角色
int cc[8]; //01, 表示第1组或第2组
vector<int>p1, p2;//临时方案
vector<int>pp1, pp2; //最优方案
int gz1 = 0;//答案是否满足规则1
int gz2 = 0;//答案是否满足规则2
int rs = 0; //人数差
int cnt = 0;
void dfs(int cur)
if(cur == 7)
// cnt++;
//规则0
if(p1.size()==0 || p2.size()==0)return ;
int mt1=0,mt2=0;
// for(int x : p1)cout<<x<<"\\n";
for(int x : p1) mt1 += cz[x][0]-'0';
for(int x : p2) mt2 += cz[x][0]-'0';
if(mt1==0 || mt2 == 0)return ;
int now1= 0, now2 = 0;
//规则1
int zh1 = 0, zh2 = 0, gb1 = 0, gb2 = 0;
for(int x : p1) zh1 += cz[x][1]-'0', gb1 += cz[x][2]-'0';
for(int x : p2) zh2 += cz[x][1]-'0', gb2 += cz[x][2]-'0';
if(zh1>0 && gb1>0 && zh2>0 && gb2>0)
now1 = 1;
if(gz1 == 0)
// cout<<"asd";
gz1 = 1; pp1 = p1; pp2 = p2;
return ;
//规则2
if(zh1>0 && zh2>0)
now2 = 1;
if(gz2 == 0 && gz1==0)
gz2 = 1; pp1 = p1; pp2 = p2;
return ;
if(now2==0)return ;
if(now1==0 && gz1==1)return ;
// cout<<"asdf";
//规则3
int rr1 = 0, rr2 = 0;
for(int x : p1)rr1 += V[x];
for(int x : p2)rr2 += V[x];
int rrs1 = 0, rrs2 = 0;
for(int x : pp1)rrs1 += V[x];
for(int x : pp2)rrs2 += V[x];
// int rss = abs((int)p1.size()-(int)p2.size());
// rs = abs((int)pp1.size()-(int)pp2.size());
int rss = abs(rr1-rr2);
rs = abs(rrs1-rrs2);
if(rss < rs)
pp1 = p1; pp2 = p2; rs = rss;
return ;
//规则4, 5
if(rss == rs)
// if(p1.size()-p2.size() > pp1.size()-pp2.size())
if(rr1-rr2>rrs1-rrs2)
pp1 = p1; pp2 = p2;
return ;
// else if(p1.size()-p2.size() == pp1.size()-pp2.size())
else if(rr1-rr2==rrs1-rrs2)
// cout<<"asf";
int ok = 0;
for(int i = 0; i < p1.size() && i<pp1.size(); i++)
if(p1[i]<pp1[i])
ok = 1;
break;
else if(p1[i]>pp1[i])
ok = -1;
break;
if(ok==1)
pp1 = p1; pp2 = p2;
return ;
else if(ok==0 && p1.size()<pp1.size())
pp1 = p1; pp2 = p2;
return ;
return ;
if(V[cur]!=0)
p1.push_back(cur);
dfs(cur+1);
p1.pop_back();
// cc[cur] = 1;
p2.push_back(cur);
dfs(cur+1);
p2.pop_back();
// cc[cur] = 0;
else
dfs(cur+1);
int main()
for(int i = 1; i <= 6; i++)
cin>>V[i];
// if(V[i]==0)n--;
for(int i = 1; i <= 6; i++)
cin>>cz[i];
mt += cz[i][0]-'0';
gb += cz[i][1]-'0';
zh += cz[i][2]-'0';
int x = cz[i][0]-'0'+cz[i][1]-'0'+cz[i][2]-'0';
if(x > V[i])
sc.push_back(i);
if(mt<=1) cout<<"GG\\n"; return 0; //数据只有这个会gg
dfs(1);
// cout<<cnt<<"\\n";
for(int i = 0; i < pp1.size(); i++)
if(i!=0)cout<<" "; cout<<pp1[i];
cout<<"\\n";
for(int i = 0; i < pp2.size(); i++)
if(i!=0)cout<<" "; cout<<pp2[i];
return 0;
5、
题意:
- 忘了
思路:
- 无脑结论
- 好吧鉴于某人的要求,详细讲一下,给的是一棵树,所以画出来很明显可以发现只有相邻的层之间会有边。
所以直接就13579层一个集合,2468层一个集合嘛,两个集合之间不可能有其他边。
然后dfs遍历一遍就可以得到两个集合的大小x和y。 - 然后考虑方案,对于第一个集合的每个点,肯定是要和第二个集合的每个点都连一遍的,所以总的方案数显然x*y。 考虑到有些边本来已经连上了,那我们就遍历的时候把原来有的边的数量累加一下(其实好像就是n-1啦)最后减掉就可以啦。
- 因为x,y都是1e6的,乘起来会爆int,所以要ll,不然只有23分。
//AC
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn = 1e6+10;
vector<LL>G[maxn];
LL x = 0, y = 0, xx = 0, yy = 0;
void dfs(LL u, LL fa, LL dep)
if(dep%2==1) x++; xx += G[u].size();
else y++; yy += G[u].size();
for(LL to : G[u])
if(to != fa)
dfs(to, u, dep+1);
int main()
LL n; cin>>n;
for(LL i = 1; i < n; i++)
LL u, v; cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
dfs(1, -1, 1);
cout<<x*y-xx<<"\\n";
return 0;
以上是关于2022 RoboCom 世界机器人开发者大赛-本科组(省赛)的主要内容,如果未能解决你的问题,请参考以下文章
2021 RoboCom 世界机器人开发者大赛-本科组(初赛)
2021 RoboCom 世界机器人开发者大赛-本科组(初赛)
2021 RoboCom 世界机器人开发者大赛-本科组(初赛)完结
2021 RoboCom 世界机器人开发者大赛-本科组(复赛)