题意:
给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 }