> 文章列表 > D. Tokitsukaze, CSL and Stone Game(博弈)

D. Tokitsukaze, CSL and Stone Game(博弈)

D. Tokitsukaze, CSL and Stone Game(博弈)

Problem - D - Codeforces

时津风和CSL正在玩一个石头的小游戏。

一开始,有n个石子堆,其中第ii堆有aiai石子。两位玩家轮流走棋。时津风先走。每一回合,棋手选择一个非空的棋堆,并从该棋堆中准确地取出一块石头。如果在轮到他之前,所有的棋堆都是空的,或者在取出石头之后,两个棋堆(可能是空的)包含相同数量的石头,那么玩家就输了。假设双方都以最佳状态下棋,那么谁会赢得比赛?

考虑一个例子:n=3n=3,堆的大小为a1=2a1=2,a2=3a2=3,a3=0a3=0.不可能选择空堆,所以时风有两个选择:第一和第二堆。如果她选择第一堆,那么状态将是[1,3,0][1,3,0],这是个好棋。但如果她选择第二堆,那么状态将是[2,2,0][2,2,0],她马上就输了。所以她唯一的好棋是选择第一堆。

假设两位棋手都是走自己的好棋,而且从不犯错,那么谁会赢得比赛?

请注意,即使一开始就有两堆相同数量的棋子,时风仍然可以下出有效的第一步棋。只需要在她走完后,没有两堆相同数量的棋子。

输入

第一行包含一个整数nn(1≤n≤1051≤n≤105)--棋堆的数量。

第二行包含n个整数a1,a2,...,na1,a2,...,an(0≤a1,a2,...,an≤1090≤a1,a2,...,an≤109),这意味着第ii堆有aiai的石头。

输出

如果时风会赢,则打印 "sjfnb"(不带引号);如果CSL会赢,则打印 "cslnb"(不带引号)。请注意,输出字符是区分大小写的。

例子

输入

拷贝

1
0
输出

复制

cslnb
输入

复制

2
1 0
输出

复制

cslnb
输入

复制

2
2 2
输出

复制

sjfnb
输入

复制

3
2 3 1
输出

复制

sjfnb
注意

在第一个例子中,时风不能拿任何棋子,所以CSL会赢。

在第二个例子中,时风只能从第一堆棋中取走一颗棋子,然后,尽管他们没有棋子,但这两堆棋的数量是一样的,这意味着CSL会赢。

在第三个例子中,时风将会获胜。这里有一个最佳方法:

首先,时风可以选择第一堆棋,并从这堆棋中取出一颗棋子。
然后,CSL只能选择第一堆,因为如果他选择第二堆,他将立即输掉。
最后,时风可以选择第二堆,然后CSL将别无选择,只能输。
在第四个例子中,他们在任何时候都只有一个好的选择,所以时风可以让游戏持续尽可能长的时间,最终获胜。
题解:
我们考虑如何进入到必败态

一.开始就是必败态

1.如果出现两堆为0,sjf操作不了,直接输

2.如果出现两组两堆相同的,sjf无论怎么操作肯定会有两个或以上相同,(2 2 2)这种也是(2 2 4 4)

3.如果出现i - 1,i , i这种形式,sjf无论怎么操作也会输

二.开始不是必败态,多远走到必败态

0,1,2,3......n - 1类似这样,如果一个人拿完,类似这种形式,那这个人必赢,因为下一个人无论如何怎么操作,都会出现两个相同的

排序一下,记录s += (ai - (i - 1))的值,如果%2 == 0,后手必胜,

 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII; 
const int N = 1e6 + 10;
int a[100050]; 
void solve()
{int n;cin >> n;for(int i = 1;i <= n;i++){cin >> a[i];}sort(a + 1,a + 1 + n);int f = 0;for(int i = 2;i <= n;i++){if(a[i] == a[i - 1]){f ++;}	if(a[i] == a[i - 1] &&a[i - 1]== 0){f = 2;}if(a[i] == a[i - 1] &&i > 2&&a[i - 2] + 1 == a[i]){f = 2;}}int s = 0;for(int i = 1;i <= n;i++){s += (a[i] - (i - 1));}if(s%2 == 0||f >= 2){cout <<"cslnb";}else{cout <<"sjfnb";}
}signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);int t = 1;
//	cin >> t;while(t--){solve(); }
}