https://codeforces.com/contest/1191/problem/D
题意:n堆石子,谁最后没有石子可取谁输,谁取完之后存在两堆相等的石子数谁输。
分情况:
1、只有一堆石子只需判断奇偶。
2、多于两堆:先手输:存在两堆相等数超过两对、存在三堆相等、存在两个0堆、只存在一对两堆(a)相等且存在一堆数为(a-1)。
3、除去以上情况后,排序,最终每个数可走a[i] - i - 1 步,判断奇偶即可。
//#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <cstdio> #include <string> #include <stdio.h> #include <queue> #include <stack> #include <map> #include <set> #include <string.h> #include <vector> #define ME(x , y) memset(x , y , sizeof(x)) #define SF(n) scanf("%d" , &n) #define rep(i , n) for(int i = 0 ; i < n ; i ++) #define INF 0x3f3f3f3f #define mod 1000000007 #define PI acos(-1) using namespace std; typedef long long ll ; int a[100009]; map<int , int>m; int main() { int n ; scanf("%d" , &n); for(int i = 0 ; i < n ; i++) { scanf("%d" , &a[i]); } if(n == 1) { if(a[0] % 2 == 0) { cout << "cslnb" << endl; } else{ cout << "sjfnb" << endl ; } } else { int flag1 = 0 , flag2 = 0 ; for(int i = 0 ; i < n ; i++) { m[a[i]]++ ; if(m[a[i]] >= 2) { flag1++ ; } } if(flag1 >= 2|| m[0] >= 2) { cout << "cslnb" << endl; } else{ ll sum = 0 ; sort(a , a+n); for(int i = 1 ; i < n ; i++) { if(a[i] == a[i-1]) { if(i >= 2 && a[i] == a[i-2]+1) { cout << "cslnb" << endl ; return 0 ; } } } for(int i = 0 ; i < n ; i++) { sum += a[i] - i ; } if(sum % 2 == 0) { cout << "cslnb" << endl ; } else{ cout << "sjfnb" << endl ; } } } return 0 ; }