Hakase and Nano(思维+博弈)

问题 C: Hakase and Nano

时间限制: 1 Sec  内存限制: 128 MB
提交: 500  解决: 142
[提交] [状态] [命题人:admin]

题目描述

Hakase and Nano are playing an ancient pebble game (pebble is a kind of rock). There are n packs of pebbles, and the i-th pack contains ai pebbles. They take turns to pick up pebbles. In each turn, they can choose a pack arbitrarily and pick up at least one pebble in this pack. The person who takes the last pebble wins.
This time, Hakase cheats. In each turn, she must pick pebbles following the rules twice continuously.
Suppose both players play optimally, can you tell whether Hakase will win?

输入

The first line contains an integer T (1≤T≤20) representing the number of test cases.
For each test case, the fi rst line of description contains two integers n(1≤n≤106) and d (d = 1 or d = 2). If d = 1, Hakase takes first and if d = 2, Nano takes first. n represents the number of pebble packs.
The second line contains n integers, the i-th integer ai (1≤ai≤109) represents the number of pebbles in the i-th pebble pack.

输出

For each test case, print “Yes” or “No” in one line. If Hakase can win, print “Yes”, otherwise, print “No”.

样例输入

复制样例数据

2
3 1
1 1 2
3 2
1 1 2

样例输出

Yes
No

题意是每次输入n,d,n代表有n堆石子,d为1表示Hakase先拿,d为2 表示Nano先拿,Hakase必须拿两次,Nano必须拿一次(不管谁拿,每次都可以取任意个数)谁能把这是自全都拿完,谁就胜

经过分析我们可以知道,当Hakase先拿的时候,只有在n为3的倍数,全部堆数都是1 的情况下才会输,

所以,在Nano先拿的时候,要尽量把情况变成对方会输的情况,所以就有三种可能:

1.n是3 的倍数,只有一对石子不是1(可以把那不是1 的石子变成1)

2.n%3=1,全部石子都是1(可以先取走一堆)

3.n%3==1,有一堆石子不是1(可以把那一堆不是1 的石子取走)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int main(){
	int t,n,d,x;
	scanf("%d",&t);
	while(t--){
		int count=0;
		scanf("%d%d",&n,&d);
		for(int i=0;i<n;i++){
			scanf("%d",&x);
			if(x==1)
			    count++;
		}
		if(d==1){
			if(n%3==0&&count==n)
			    printf("No\n");
			else
			    printf("Yes\n");
		}
		else{
			if((n%3==1&&count==n)||(n%3==0&&count==n-1)||(n%3==1&&count==n-1))
			    printf("No\n");
			else
			    printf("Yes\n");
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/red_red_red/article/details/89066038
今日推荐