[atcoder002E] Candy Piles [博弈论]

题面:

传送门

思路:

每一堆糖排成一列,所有列横着放,形成一个阶梯型

两个决策相当于左边一列去掉和最下面一行去掉

那么这个模型可以转化为同样形状的网格图,向左上方走,走到边界的赢·

然后一波数学推导带走

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,ans,a[100100];
 6 int main(){
 7     scanf("%d",&n);
 8     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
 9     sort(a+1,a+n+1);
10     reverse(a+1,a+n+1);
11     for(int i=1;i<=n;i++){
12         if(i+1>a[i+1]){
13                for(int j=i+1;a[j]==i;j++) ans^=1;
14                ans|=(a[i]-i)&1;
15                puts(ans? "First":"Second");
16                return 0;
17            }    
18     }    
19 } 

 

posted @ 2018-02-23 11:01  dedicatus545  阅读(355)  评论(0编辑  收藏  举报