Tokitsukaze, CSL and Stone Game
题外话
对于某些人说降绿甚至降黄,本人是很不同意的,毕竟多一道水蓝有什么不好
题意
翻译得很简洁,不再赘述。
Solution
不难发现有以下几种情况:
-
只有两堆不等的,肯定选少的那堆,因为这样不易使得两堆相等。
-
若两堆相等,一定破坏相等的情况,否则取完后就输了,若之后还有两堆相等的,还是输。
-
就一堆,先后手分别取。
-
若剩下的堆形成首项为 \(0\) 的公差为 \(1\) 的等差公式,那么操作者输,因为不论怎么操作一定会使得操作完后有两堆相等的。
-
有三堆,那么先手必输,原因由上述。
其余就是暴力实现了,看码力,详见代码。
Code
// written by Naught
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define Maxn 100005
#define fo(i, l, r) for (int i = l; i <= r; ++i)
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21], *p1 = buf, *p2 = buf;
inline int read(int x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}
int n, a[Maxn], sum, m;
int main()
{
n = read();
fo(i, 1, n) a[i] = read(), sum += a[i];
sort(a + 1, a + n + 1);
fo(i, 1, n) if(a[i] == a[i + 1]) ++m;
if(m >= 2) return puts("cslnb"), 0;
if(m == 1) fo(i, 1, n) if( (a[i] == a[i + 1] && a[i - 1] + 1 == a[i] && i != 1) || (a[i] == a[i + 1] && a[i] == 0) ) return puts("cslnb"), 0;
m = 0;
fo(i, 1, n) m += i;
m -= n;
if(sum - m == 0) return puts("cslnb"), 0;
if(((sum - m) & 1) == 0) return puts("cslnb"), 0;
else return puts("sjfnb"), 0;
return 0;
}
标签:CSL,相等,return,puts,两堆,题解,Tokitsukaze,Game,cslnb
From: https://www.cnblogs.com/naughty-naught/p/18503180