codeforces round 941div2(a,b,c)

题目链接
a,b各控了我半小时,后面博弈就没想出来了

A

大于等于 k k k的全能消去变成 k − 1 k-1 k1,再去结合小于 k k k的也全能消去变成 k − 1 k-1 k1

void solve()
{
    int n,k;cin>>n>>k;
    vector<int>a(n+1);
    bool flag=1;
    map<int,int>mp;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        mp[a[i]]++;
        if(mp[a[i]]>=k)flag=0;
    }
    if(flag||n==1){cout<<n<<'\n';return;}
    cout<<k-1<<'\n';
}

B

只需要判断,是否每条边都有B或W就行了


  void solve()
{
    int n,m;cin>>n>>m;
    vector<string>mv(n+1);
    for(int i=1;i<=n;i++)cin>>mv[i];
    map<char,int>mp;
    for(int i=0;i<m;i++){
        if(mv[1][i]=='B'){mp['B']++;break;}
    }
    for(int i=0;i<m;i++){
        if(mv[n][i]=='B'){mp['B']++;break;}
    }
    for(int i=1;i<=n;i++){
        if(mv[i][0]=='B'){mp['B']++;break;}
    }
    for(int i=1;i<=n;i++){
        if(mv[i][m-1]=='B'){mp['B']++;break;}
    }

    for(int i=0;i<m;i++){
        if(mv[1][i]=='W'){mp['W']++;break;}
    }
    for(int i=0;i<m;i++){
        if(mv[n][i]=='W'){mp['W']++;break;}
    }
    for(int i=1;i<=n;i++){
        if(mv[i][0]=='W'){mp['W']++;break;}
    }
    for(int i=1;i<=n;i++){
        if(mv[i][m-1]=='W'){mp['W']++;break;}
    }
    if(mp['B']==4||mp['W']==4)cout<<"YES"<<'\n';
    else cout<<"NO"<<'\n';
}

C

每轮有两种取法,若最小为 1 1 1则只能取 1 1 1,且会去掉一个或多个 1 1 1;否则可取 ( 1 , m i n ( a 1 , a 2... a n ) ) (1,min(a1,a2...an)) (1,min(a1,a2...an)),且可选择是否去掉一个或多个最小数。所以我们排序去重之后,找到第一个与前一位数相差不是 1 1 1的数,记录位置,则当操作到这个位置时,谁先手谁赢。需要特判一下 1 , 2 , 3 , 4... n 1,2,3,4...n 1,2,3,4...n

void solve()
{
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a.begin()+1,a.end());
    a.erase(unique(a.begin()+1,a.end()),a.end());
    //for(auto x:a)cout<<x<<' ';
    if(n==1){
        cout<<"Alice"<<'\n';
        return;
    }
    int t=0;
    int m=a.size()-1;
    for(int i=1;i<=m;i++){
        if(a[i]!=i){t=i;break;}
    }
    if(!t){
        if(m&1)cout<<"Alice"<<'\n';
        else cout<<"Bob"<<'\n';
        return;
    }
    if(t&1)cout<<"Alice"<<'\n';
    else cout<<"Bob"<<'\n'; 
}
  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值