Codeforces Round #573 Tokitsukaze, CSL and Stone Game
Tokitsukaze, CSL and Stone Game
题目分析
1、有判定条件知拿完石子胜利,移动后出现相同石子数量失败
那么容易想到的是最终出现的情况为0,1,2,3----n那么一定会出现这种情况吗?
若一开始石子数各不相同,过程若存在两堆石子n,n+1,若不存在n-1,则取n这一堆。
若0-----n-1都存在,说明构成0--------n+1,则需要取石子数大于n+1的石子堆。
最终必将构成0------------------n
所以只需要考虑需要取的石子数,奇数个先手胜,偶数个后手胜
2、特判
若开始石子堆就有重复个数的石子
1、3个以上相同的石子 (1,1,1) 2、两种以上相同的石子(1,1,2,2)
3、两堆相同n个石子且存在n-1个石子(1,2,2) 4、两个空堆(0,0,1)
代码
#include <cstdio>
#include <map>
using namespace std;
#pragma warning (disable:4996)
typedef long long int LL;
const int maxn = 100005;
int a[maxn];
map<int, int>Map;
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
LL sum = 0;
int cnt = 0, flag = 0;
for (int i = 1; i <= n; i++) { //特判1、2
sum += LL(a[i]);
Map[a[i]]++;
if (Map[a[i]] > 1)
cnt++, flag = a[i];
if (cnt >= 2) {
printf("cslnb\n");
return 0;
}
}
//特判3,4
if (Map[0] == 2 || (flag && Map[flag - 1] == 1)) {
printf("cslnb\n");
return 0;
}
sum -= (LL(n) * (n - 1)) >> 1; //统计移动石子数
if (sum & 1) {
printf("sjfnb\n");
}
else {
printf("cslnb\n");
}
}