題面
題意
有n堆糖果,每堆糖果有ai個,雙方輪流吃糖果,每次可以選擇將每堆糖果各吃一個或者吃光最多的那堆糖果,吃完糖的人算負,問先後手誰會贏。
做法
這題需要轉化一下,可以將每堆糖果按數量降序排列,然後將第i堆糖果轉化爲高度爲a[i]的矩形,然後從(1,1)開始走,吃光最多的一堆可以看作向右走一步,每堆各吃一個可以看作向上走一步,不能走出矩形,無路可走者算負。
對於這個問題可以發現(x,y)和(x+1,y+1)的勝負狀態是一樣的,然後將(1,1)轉化爲最大的不出矩形的(k,k),然後看一下這個點上方和右邊有幾步可以走即可。
代碼
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100100
using namespace std;
int n,num[N];
inline bool cmp(int u,int v)
{
return u>v;
}
int main()
{
int i,j;
cin>>n;
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
sort(num+1,num+n+1,cmp);
for(i=1;i<=n;i++)
{
if(i>num[i]) break;
}
i--;
if((num[i]-i)&1)
{
puts("First");
return 0;
}
for(j=i+1;num[j]==i;j++);
j--;
if((j-i)&1)
{
puts("First");
return 0;
}
puts("Second");
}