zoukankan      html  css  js  c++  java
  • 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;
        }
    
  • 相关阅读:
    spark RDD操作的底层实现原理
    Spark累加器(Accumulator)陷阱及解决办法
    spark collect获取所有元素
    spark submit 入门
    pyspark使用ipython
    top k
    快速排序
    用 Spark 为 Elasticsearch 导入搜索数据
    静态成员变量不占用类的内存空间
    重载函数的调用匹配规则
  • 原文地址:https://www.cnblogs.com/Aya-Uchida/p/11185265.html
Copyright © 2011-2022 走看看