codeforces1191D Tokitsukaze, CSL and Stone Game 博弈论

Posted aya-uchida

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces1191D Tokitsukaze, CSL and Stone Game 博弈论相关的知识,希望对你有一定的参考价值。

网址:http://codeforces.com/problemset/problem/1190/B

题意:

给出n堆石头,两个人轮流从非空的石头堆中取一颗石头,如果某人开始前,石头已经被取完,或者取了之后,出现两堆石头数量相同,则输,假设两个人每次都会走最佳选择,求最后谁会赢。

题解:

结论:在自己取石头之后,石头堆是0,1,2,3......n-1时,必胜,故两方一定是想办法构造成这个样子。然后是特殊情况,如果已经有两个空堆,或者三堆相同,或者两堆相同且存在一堆比这堆少一个(5,5,4-》5,4,3-》4,4,3 or 5,3,3),则必然后手胜。

AC代码:

    #include <iostream>
    #include <vector>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int num[100005];
    bool check(int n)
    
        if(n>=2&&num[0]==0&&num[1]==0)
            return 1;
        for(int i=2;i<n;++i)//连续三堆相同
            if(num[i]==num[i-1]&&num[i-1]==num[i-2])
                return 1;
        for(int i=2;i<n;++i)
            if(num[i]==num[i-1]&&num[i]==num[i-2]+1)//第一个必须取一个,第二个再取一个,相等,输
                return 1;
        int cnt=0;
        for(int i=1;i<n;++i)//相同对
            if(num[i]==num[i-1])
                ++cnt;
        return cnt>1;
    
    int main()
    
        int n;
        cin>>n;
        for(int i=0;i<n;++i)
            cin>>num[i];
        sort(num,num+n);
        if(check(n))
        
            cout<<"cslnb"<<endl;
            return 0;
        
        long long sum=0;
        for(int i=0;i<n;++i)
            sum+=num[i];
        if((sum-n*(n-1)/2)%2)
            cout<<"sjfnb"<<endl;
        else
            cout<<"cslnb"<<endl;
        return 0;
    

 

以上是关于codeforces1191D Tokitsukaze, CSL and Stone Game 博弈论的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces - 1191D - Tokitsukaze, CSL and Stone Game - 博弈论

codeforces上怎么看测试数据

如何看codeforces做了多少题

codeforces上怎么看测试数据

codeforces比赛后怎么看题解和答案

codeforces是啥?