D. Tokitsukaze, CSL and Stone Game ( 取石子游戏?no,更像棋盘游戏 )
Posted willems
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Tokitsukaze, CSL and Stone Game ( 取石子游戏?no,更像棋盘游戏 )相关的知识,希望对你有一定的参考价值。
题意: 有 n 堆石子,每堆有 a[ i ] 个,然后每次 操作 可以选择任意一堆 石子,取走一个。 若你取完了之后,存在两堆石子,他们的个数一样多,你就输了( 包括两堆都是0个), 或者你不能取了,你也输了。
解: 1、若只有一堆,那就判奇偶就行了。
2、若存在 至少 两对 相等个数的 堆, 或者 两堆个数 为0 的堆,或者3堆石子都相等,先手必败( 两对的话,至多只能 使一对,变成不等的。)
3、 按升序排序,若存在两堆个数相等,都为 a,且有一堆的石子数为 a - 1 那么先生必败。 因为 你只能拿走一个,你拿走了一个,那你就和a - 1那堆相等了,你不拿,那你就和a那堆相等了。
无论如何都会有两堆相等。
4、若不存在上述情况, 那么,总的可以移动的步数是固定的。 按升序 排好后, 对于 第 i 堆,它能移动的步数 就是
a[ i ] - i - 1,然后把总的可以移动的步数加起来 判断奇偶就行了。
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define LL long long #define ULL unsigned long long #define rep(i,j,k) for(int i=j;i<=k;i++) #define dep(i,j,k) for(int i=k;i>=j;i--) #define INF 0x3f3f3f3f #define mem(i,j) memset(i,j,sizeof(i)) #define make(i,j) make_pair(i,j) #define pb push_back #define Pi acos(-1.0) using namespace std; const int N = 2e5 + 5; LL a[N]; int main() int n; scanf("%d", &n); LL sum = 0; rep(i, 1, n) scanf("%I64d", &a[i]), sum += a[i]; if(n == 1) if(a[1] % 2 == 0) puts("cslnb"); else puts("sjfnb"); return 0; sort(a + 1, a + 1 + n); int cnt = 0; rep(i, 2, n) if(a[i] == a[i - 1]) cnt++; if(i > 2 && a[i - 2] + 1 == a[i]) puts("cslnb"); return 0; if(cnt >= 2 || n >= 2 && a[2] == 0) puts("cslnb"); return 0; sum -= n * (n - 1) / 2; ///0 + 1 + 2 + 3 + ……+ (n - 1) = n * ( n - 1) / 2; if(sum % 2 == 0) puts("cslnb"); else puts("sjfnb"); return 0;
以上是关于D. Tokitsukaze, CSL and Stone Game ( 取石子游戏?no,更像棋盘游戏 )的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)
codeforces1191D Tokitsukaze, CSL and Stone Game 博弈论
Codeforces - 1191D - Tokitsukaze, CSL and Stone Game - 博弈论
HDU 6797 Tokitsukaze and Rescue
Codeforces Round #573 (Div. 2) A. Tokitsukaze and Enhancement