AtCoder1999 Candy Piles

題面

題意

有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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章