Problem - 1190B - Codeforces(分类讨论博弈)

Problem - 1190B - Codeforces

题目大意:有 n n n堆石子,每堆的数目为 a i a_i ai,现在Alice和Bob两个人可以移走任意一堆不为空的石子中的一颗石子,如果某人移动完石子后,有两堆的石子数相同,那么另一个人获胜;如果某人当前没有可移动的石子,另一个人同样获胜。

题目大意:我们思考两种情况。
一种情况是当前局面已经存在只要移动就一定会失败的情况。那么此时至少有两对组合满足石子个数 a i = a j a_i=a_j ai=aj,或者是形如 2 , 3 , 3 2,3,3 233这种情况,无论怎么移动都会有相同石子。
第二种情况是两人最优取法最多能取多少个,最优的取法一定是不断地取,最终让石子堆形成一个从 0 0 0开始的严格递增序列,那么我们计算一下最终可取的个数,判一下奇偶就可以了。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define syncfalse ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
const int N = 1e5+5;
ll a[N];
int main(){
    syncfalse
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    int n;
    cin>>n;
    for (int i = 1; i <= n; ++i)cin>>a[i];
    sort(a+1, a+1+n);
    bool flag = false;
    for (int i = 1; i <= n; ++i){
        if (a[i])flag=true;
    }
    ll sum = 0;
    int num = 0;
    for (int i = 2; i <= n; ++i){
        if (a[i]==a[i-1]){
            if (a[i]==0)flag=false;
            else num++;
        }
    }
    if (num>1)flag=false;
    for (int i = 2; i < n; ++i){
        if (a[i]==(a[i-1]+1)&&a[i]==a[i+1])flag=false;
    }
    for (int i = 1; i <= n; ++i){
        ll tem = a[i]-i+1;
        if (tem<0)flag=false;
        sum+=tem;
    }
    if (sum%2==0)flag=false;
    if (!flag)cout << "cslnb\n";
    else{
        cout << "sjfnb\n";
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值