题意:
有$N$堆糖,两个人轮流拿糖,可以从每堆糖里拿$1$颗糖或拿走最多的一堆,拿到最后一颗糖的人输,问是否先手必胜
首先把问题转化一下,以$(7,6,6,6,4,4,4,2)$为例
假设左下角的点及其右上图形构成当前状态,答案就是$(1,1)$的胜负状态
在所有糖果堆中吃一颗$\Rightarrow$把最下一列删掉$\Rightarrow$点往上移$1$单位
吃掉糖果数最多的糖果堆$\Rightarrow$把最左一列删掉$\Rightarrow$点往右移$1$单位
观察对角线上的位置$(x,x)$
若$(x,x)$先手必败,则$(x-1,x)$和$(x,x-1)$都先手必胜,则$(x-1,x-1)$先手必败
若$(x,x)$先手必胜,则$(x-1,x)$和$(x,x-1)$中有先手必败,则$(x-1,x-1)$先手必胜
所以一旦确定对角线最远端的状态,整条对角线的状态都确定了,而且是一样的
对角线最远端的状态就容易确定了,从最上和最右一路推过来即可
yes!
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100010],n,i,j,up,right;
bool cmp(int a,int b){return a>b;}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",a+i);
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++){
if(a[i]>=i&&a[i+1]<=i)break;
}
up=((a[i]-i)&1)^1;
for(j=i;a[j]==i;j++);
j--;
right=((j-i)&1)^1;
puts((up&right)?"Second":"First");
}