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 世界机器人开发者大赛-本科组(复赛)

2021 RoboCom 世界机器人开发者大赛-本科组(复赛)

2021 RoboCom 世界机器人开发者大赛-本科组(决赛)