题意:有T组数据,每组数据输入一个n,d,n为石子堆的数目,d为1表示Hakase先取,2表示Nano先取,然后输入n个数据表示第i堆石子有ai个石子,一次只能去一堆任意个石子切最少取一个,Hakase每次必须取两次,Nano每次必须取一次。Hakase赢就输出Yes否则输出No。
思路:不难发现d=1时,当且仅当石子堆数是3的倍数且每堆石子的数量只能是1,Hakase才能输,d=2时只要Nano可以构造d=1的情况Hakase才能输。比如说1 1 x(x>1)或者1 1 1 x(x为任意数)就可以构造1 1 1使Hakase输。
#include<iostream>
#include<cstdio>
using namespace std;
int a[1000000];
int main()
{
int T;
int n,d;
int sum=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&d);
if(d==1)
{
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
if(a[i]==1)
{
sum+=1;
}
}
if(sum==n&&sum%3==0)
{
printf("No\n");
}
else
{
printf("Yes\n");
}
sum=0;
}
else
{
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]==1){
sum+=1;
}
}
if((sum+1==n&&n%3==0)||(sum==n&&sum%3==1)||(sum+1==n&&n%3==1)){ // 1 1 x 或者 1 1 1 x 或者 1 1 1
printf("No\n"); //三种情况!
} //Hakse 输的情况!
else {
printf("Yes\n");
}
sum=0;
}
}
return 0;
}