Codeforces1190B-Tokitsukaze, CSL and Stone Game

it2022-05-05  122

博弈论。 可能大体上比较好想,中间有可能会漏掉一些细节。 可以先判断先手走一步必输的情况( s u m [ i ] sum[i] sum[i]表示 i i i出现的次数): 1 、 s u m [ 0 ] > 1 1、sum[0]>1 1sum[0]>1 2 、 ∀ i 2、\forall i 2i s u m [ i ] > 2 sum[i]>2 sum[i]>2 3 、 ∀ i , j 3、\forall i,j 3i,j s u m [ i ] > 1 sum[i]>1 sum[i]>1&& s u m [ j ] > 1 sum[j]>1 sum[j]>1 4 、 ∀ i > 1 4、\forall i>1 4i>1 s u m [ i ] > 1 sum[i]>1 sum[i]>1&& s u m [ i − 1 ] > 0 sum[i-1]>0 sum[i1]>0 除此之外,可以判断可行动步数的奇偶性。 我们考虑 n n n堆石子,第 i i i堆有 i − 1 i-1 i1个石子,此时任意一人拿石子都会输。 因此可行动步数就是石子总数 − ( 1 + 2 + … … + ( n − 1 ) ) -(1+2+……+(n-1)) (1+2++(n1)) C o d e : Code: Code

#include<bits/stdc++.h> using namespace std; int n,a[100005]; int main() { scanf("%d",&n); long long sum=0; int k=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]==0)k++; sum+=a[i]-(i-1); } sort(a+1,a+n+1); int s=0;bool flag=false; for(int i=2;i<=n;i++) if(a[i]==a[i-1]) { s++; if(a[i-1]==a[i-2]+1&&i-2>0)flag=true; } if(sum%2==0||s>=2||k>=2||flag)puts("cslnb");else puts("sjfnb"); return 0; }

最新回复(0)