zoukankan      html  css  js  c++  java
  • 【luogu AT1999】Candy Piles(博弈论)

    Candy Piles

    题目链接:luogu AT1999

    题目大意

    给你 n 个数,每次你可以选择删去最大的数,或者使所有非 0 数减一。
    然后谁操作之后只剩 0 或者没有数,就输了。
    然后问你先手还是后手必胜。

    思路

    考虑把数组从大到小排序。

    然后变成这样的图(来自题解,下同)(属于是懒得画图)
    在这里插入图片描述

    那你每次操作要么删去左边一列,要么删去下面一列。

    那你考虑变成从左下角走,每次往右或者往上,碰到边界就死了。

    那边界就是必败点,然后我们不难通过 SG 函数来得出它的输赢大概的样子:
    (圆圈必败,叉叉必胜)
    在这里插入图片描述

    然后考虑小小的找规律,发现凸出去的位置所在的对角线是叉,然后每隔两个有一个对角线是叉(这个要上面是直线)。

    那我们就看看左下角所在对角线是不是叉即可。

    代码

    #include<cstdio>
    #include<algorithm>
    
    using namespace std;
    
    int n, a[100005];
    
    bool cmp(int x, int y) {
    	return x > y;
    }
    
    int main() {
    	scanf("%d", &n);
    	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    	
    	sort(a + 1, a + n + 1, cmp);
    	
    	for (int i = 1; i <= n; i++)
    		if (i + 1 > a[i + 1]) {
    			int dis = 0;
    			while (a[i + dis + 1] == i) dis++;
    			if ((dis & 1) || ((a[i] - i) & 1)) printf("First");
    				else printf("Second");
    			return 0;
    		}
    	
    	return 0;
    }
    
  • 相关阅读:
    算法导论
    深度探索C++对象模型
    git 介绍及其使用总结
    前端跨域常见的几种方式
    前端面试angular 常问问题总结
    低版本浏览器支持HTML5标签的方法
    理解 angular 的路由功能
    Angular 新手容易碰到的坑
    Angular 新手容易碰到的坑
    一 Unicode和UTF-8的异同
  • 原文地址:https://www.cnblogs.com/Sakura-TJH/p/luogu_AT1999.html
Copyright © 2011-2022 走看看