列表

详情


NC50619. 取石子

描述

Alice和Bob两个好朋友又开始玩取石子了。游戏开始时,有N堆石子排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个:
  • 从某堆石子中取走一个;
  • 合并任意两堆石子。
不能操作的人输。Alice想知道,她是否能有必胜策略。

输入描述

第一行输入T,表示数据组数。
对于每组测试数据,第一行读入N;
接下来N个正整数,表示每堆石子的数量。

输出描述

对于每组测试数据,输出一行。
输出YES表示Alice有必胜策略,输出NO表示Alice没有必胜策略。

示例1

输入:

3
3
1 1 2
2
3 4
3
2 3 5

输出:

YES
NO
NO

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 30ms, 内存消耗: 4072K, 提交时间: 2020-12-01 11:34:26

#include<bits/stdc++.h>
using namespace std;
int t,n,a,x,y;
bitset<501201>f[51],vis[51];
bool dfs(int x,int y){
	if(x==0&&y==0)return 0;
	if(y==1)x++,y=0;
	if(!vis[x][y]){
		if(x){
			f[x][y]=!dfs(x-1,y);
			if(y)f[x][y]=f[x][y]||!dfs(x-1,y+1);
			if(x>1)f[x][y]=f[x][y]||!dfs(x-2,y+(bool)y+2);
		}if(y)f[x][y]=f[x][y]||!dfs(x,y-1);
		vis[x][y]=true;
	}return f[x][y];
}int main(){
	for(scanf("%d",&t);t--;){
		x=y=0,scanf("%d",&n);
		while(n--){
			scanf("%d",&a);
			if(a==1)x++;
			else y+=(bool)y+a;
		}puts(dfs(x,y)?"YES":"NO");
	}return 0;
}

Python3 解法, 执行用时: 119ms, 内存消耗: 4624K, 提交时间: 2022-11-21 17:33:37

t = int(input())
for i in range(t):
    n = int(input())
    A = [*map(int, input().split())]
    a = A.count(1)
    b = n + sum(A) - 2 * a - 1
    if b<=2:
        if a%3:
            print("YES")
        else:
            print("NO")
    else:
        if a%2==1 or b%2==1:
            print("YES")
        else:
            print("NO")

上一题