【HDU6266】Hakase and Nano(博弈+规律)

题目链接

【题意】

有T组数据,每组数据输入一个n,d,n为石子堆的数目,d为1表示Hakase先取,2表示Nano先取,然后输入n个数据表示第i堆石子有ai个石子,一次只能去一堆任意个石子切最少取一个,Hakase每次必须取两次,Nano每次必须取一次。Hakase赢就输出Yes否则输出No。

【解题思路】

5555第一次做出博弈真是太感人了。

当H先手时,手动模拟可以发现只有n是3的倍数,且ai都为1的情况H才会输。

当N先手时,因为N想赢所以肯定想转换到上述H会输的状态,所以H在n是3的倍数,且有n-1个数为1时会输(这时N只需从不是1的那堆石子里拿掉一些石子使状态变为1 1 1),或者n是3的倍数余1,且n个数为1时会输(此时N只需拿掉一堆石子,H就到了必输态),或者n是3的倍数余1,且n-1个数为1时会输(此时N只需拿掉一堆不是1的石子,H就到了必输态)。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int a[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,d,cnt=0;
        scanf("%d%d",&n,&d);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]==1)cnt++;
        }
        if(d==1)
        {
            if(n%3==0 && cnt==n)
                printf("No\n");
            else printf("Yes\n");
        }
        else
        {
            if((cnt==n && n%3==1) || (cnt==n-1 && n%3==1) || (cnt==n-1 && n%3==0) )
                printf("No\n");
            else printf("Yes\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39826163/article/details/81986219