首页 > 其他 > 详细

[Agc002E/At1999] Candy Piles - 博弈论

时间:2020-02-06 19:08:31      阅读:79      评论:0      收藏:0      [点我收藏+]

有n堆石子,第i堆有ai个石子。有两种操作:
把石子最多的那一堆给丢掉
把每一堆全部丢掉一个
谁拿走最后石子谁输。判断胜负情况。

直觉转化为一个走棋盘问题

考虑如何计算左下角点的状态

找到原点最右上方且不在边界上的点

如果这个点和上方、和右方距离有一个是奇数,那么这个点就是后手必胜点,即First

找上方很容易

找右方,只需要找到第一个小于等于自己的,做差即可

#include <bits/stdc++.h>
using namespace std;

int n,a[100005];

int main() {
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    reverse(a+1,a+n+1);
    for(int i=1;i<=n;i++) {
        if(i+1>a[i+1]) {
            int j=0;
            while(a[j+i+1]==i)++j;
            if((a[i]-i)%2 || j%2) cout<<"First";
            else cout<<"Second";
            return 0;
        }
    }
}

[Agc002E/At1999] Candy Piles - 博弈论

原文:https://www.cnblogs.com/mollnn/p/12269593.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!