NC50621. 取石子游戏
描述
输入描述
第一行为一个整数T,表示有T组测试数据。
对于每组测试数据,第一行为一个整数n,表示有n堆石子,第二行为n个整数,依次表示每堆石子的数目。
输出描述
对于每组测试数据仅输出一个整数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; }