HDU 6266 Hakase and Nano【规律】

题目大意:

H和N玩取石子游戏,给出n堆石子,每堆$a_i$个,H每回合取两次,N每回合取一次,每次都只能从某一堆石子中取出至少一个石子,取走最后一个(堆)石子的获得胜利。

规定先后手,两者都采取最佳策略,问最后H能否获胜。

解题思路:

H先手时,经过手算(?)我们发现当n % 3 == 0 && n个石子全为1的时候先手必输。所以当H后手的时候,只要先手通过一步操作使当前局面变成上述局面H就输了。

这样只需要记录一下所给石子中不为0的石子堆的数目,根据这个输出答案就可以了。

Mycode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

int t, n, k, a, o;
int main()
{
scanf("%d", &t);
while(t--)
{
scanf("%d%d",&n,&k);
o = 0;
for(int i = 0; i < n; ++i)
{
scanf("%d", &a);
o += (a > 1);
}
if(k == 1)
{
if(n % 3 == 0 && o == 0)
puts("No");
else
puts("Yes");
}
else
{
if((n - 1) % 3 == 0 && o <= 1)
puts("No");
else if(n % 3 == 0 && o == 1)
puts("No");
else
puts("Yes");
}
}
return 0;
}
Donate comment here
0%