AtCoder1999 Candy Piles

版权声明:本文为博主原创文章,未经博主允许不得转载。 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");
}

猜你喜欢

转载自blog.csdn.net/yzyyylx/article/details/81448349