题目描述
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
题意:H和N进行博弈游戏,一共有n堆石子,每人至少拿一个(一次可以拿一堆),N一次只能进行一次操作,而H必须进行两次操作(除非只需一次操作就能胜利)。问输入的石子的情况H是否肯定胜利。
题解:
可根据H输的情况进行讨论,此时又包含两种情况,即先手和后手。
1.先手。可以手动模拟只有式子数全为1并且是3的倍数时H才会输!!
2、后手。因为每个人的操作都是最佳的,所以只有N进行一次操作后,把石子的情况改变成3的倍数并且全是1的情况,N才会输。
#include<iostream>
#include<cstdio>
const int maxn = 1e6+2;
using namespace std;
int p[maxn];
int x;
int num;
int n,d;
int main()
{
int t;
cin>>t;
while(t--){
num = 0;
cin>>n>>d;
for(int i = 0;i<n;i++){
cin>>x;
if(x == 1)
num++;
}
if(d == 1){ //先手
if(n%3 == 0&&num == n)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
else if(d == 2){//后手
if((n%3 ==1&&num==n-1) || (n%3==0&&num == n-1)||(n%3==1&&num==n))
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
}
}