codeforces1190B 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;
    }

猜你喜欢

转载自www.cnblogs.com/Aya-Uchida/p/11185265.html