题目链接
题意:
给你n堆石子,每堆石子个数>=1,现在有两个人,一个人每次能拿两次,另一个人只能拿一次,如果输入1就两次的人先拿,2就1次的人先拿,求最后的获胜者是谁。
思路:
两次先手:他失败的情况只有一种:石子的个数是3的倍数,且每堆石子的个数必须都是1.
一次先手:如果他想赢,那就必须将当前的局面构造成另一个人失败的情况。即当前局面石头堆的个数为3的倍数加1且石子数为1的堆数>=总的石子数-1,或者是当前局面石头堆的个数为3的倍数且石子数为1的堆数=总的石子数-1。
代码:
#include <cstdio>
using namespace std;
const int MAXN = 1e6+10;
int a[MAXN];
int main(){
int T;scanf("%d",&T);
while(T--){
int n,d;scanf("%d%d",&n,&d);
int cnt=0;
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((n%3==1 && cnt>=n-1)||(n%3==0 &&cnt==n-1)){
printf("No\n");
}else {
printf("Yes\n");
}
}
}
return 0;
}