zoukankan      html  css  js  c++  java
  • 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
    一步一步,永不停息
  • 相关阅读:
    javascript获取当前日期、年份和月份等
    程序员也可以懂一点期望值管理
    数据类型,隐式转换以及json,对象,引用类型,预解析 视频教程
    两个值交互位置的几种方法
    通过Class获取标签,兼容的几种思路
    前端开发流程
    元素多层嵌套,JS获取问题
    原生JS实现分页效果2.0(新增了上一页和下一页,添加当前元素样式)
    原生JS实现分页效果1.0
    学习方法,以及时间的安排。
  • 原文地址:https://www.cnblogs.com/Willems/p/11180197.html
Copyright © 2011-2022 走看看