[Agc002E/At1999] Candy Piles

有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;
        }
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/12269593.html