列表

详情


NC50621. 取石子游戏

描述

在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的:
有n堆石子,将这n堆石子摆成一排。游戏由两个人进行,两人轮流操作,每次操作者都可以从最左或最右的一堆中取出若干颗石子,可以将那一堆全部取掉,但不能不取,不能操作的人就输了。
Orez问:对于任意给出一个初始一个局面,是否存在先手必胜策略。

输入描述

第一行为一个整数T,表示有T组测试数据。
对于每组测试数据,第一行为一个整数n,表示有n堆石子,第二行为n个整数a_i,依次表示每堆石子的数目。

输出描述

对于每组测试数据仅输出一个整数0或1。其中1表示有先手必胜策略,0表示没有。

示例1

输入:

1
4
3 1 9 4

输出:

0

原站题解

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

C++ 解法, 执行用时: 66ms, 内存消耗: 8240K, 提交时间: 2022-06-25 20:28:55

#include<bits/stdc++.h>
using namespace std;
int n,T;
int a[1010];
int l[1010][1010],r[1010][1010];
int main()
{
    cin>>T;
	while(T--)
	{
        cin>>n;
        for(int i=1; i<=n; i++)
            cin>>a[i];
		for(int len=1; len<=n; len++)
		{
			for(int i=1; i+len-1<=n; i++)
			{
				int j=len+i-1;
				int ll=l[i][j-1],rr=r[i][j-1];
				int x=a[j];
				if(len==1)
				l[i][j]=r[i][j]=a[i];
				else{
					if(x==rr)l[i][j]=0;
					else if(x<ll&&x<rr||x>ll&&x>rr)l[i][j]=x;
					else if(ll>rr)l[i][j]=x-1;
					else l[i][j]=x+1;
				}
				ll=l[i+1][j],rr=r[i+1][j],x=a[i];
				if(len==1)l[i][j]=r[i][j]=a[j];
				else{
					if(x==ll)r[i][j]=0;
					else if(x<ll&&x<rr||x>ll&&x>rr)r[i][j]=x;
					else if(ll<rr)r[i][j]=x-1;
					else r[i][j]=x+1; 
				}
			}
		}
		cout<<(l[2][n]!=a[1])<<endl;
	}
    return 0;
}

上一题