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;
}
View Code

 

转载于:https://www.cnblogs.com/Willems/p/11180197.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值