【博弈】Codeforces Round #573 (Div. 1) Tokitsukaze, CSL and Stone Game

题意:
给n堆石子,每一堆有a[i] 个 石头,现在二人玩游戏,每一人每一次选择一个非空的石头堆,从中拿出一个石头。如果当一个人操作之后,这n堆石头中有两堆中的石头数量是相同的,那么这个人就输掉。假设二人绝对聪明,请判断是先手赢还是后手赢。

题解:

    先特判先手必输的情况

       1.有两堆为0

       2.有三堆数量相等

       3.有两对堆分别数量相等

       4.  x  x  x-1

   然后考虑决出输赢前的最终状态一定是  0,1,2,3,4……n-1

   用石子总数sum-最终状态前一步石子总数 判断奇偶

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N=100000+15;
 5 int n; long long a[N],sum;
 6 inline bool judge()
 7  {if(n>1 && a[1]==0 && a[2]==0) return 1;
 8   
 9   int cnt=0;
10   for(int i=1;i<n;i++)
11    {if(a[i]==a[i+1]) cnt++;
12     if(cnt>=2) return 1;
13    }    
14   for(int i=1;i<=n-2;i++)
15    if(a[i]==a[i+1]-1 && a[i+1]==a[i+2]) return 1;
16   
17   return 0; 
18  }
19 int main()
20  {
21  scanf("%d",&n);    
22  for(int i=1;i<=n;i++)    {scanf("%lld",&a[i]); sum+=a[i];}
23   
24  sort(a+1,a+n+1);     
25  
26  if(judge()) {printf("cslnb"); return 0;}    
27      
28  sum=sum-1ll*(n-1ll)*n/2;    
29  if(sum&1)  printf("sjfnb");
30  else       printf("cslnb");    
31      
32 return 0;
33  }

 

posted @ 2019-07-24 14:22  YuXiaoze  阅读(187)  评论(0编辑  收藏  举报