版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yzyyylx/article/details/81448349
题面
题意
有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");
}