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 ;
- }
来源: http://www.bubuko.com/infodetail-3398489.html