Description
Rusty 小姐与Drill 先生是两名超级矿工,他们在一个矿点中采矿,矿点里面有N堆矿物,他们的任务是把矿物运到门口的传送车,让传送车把矿物运回地面。矿物堆根据离门口由近到远,编号为1 2 3 ……..单纯的搬运矿物很无聊,所以Rusty和Drill准备来一场“超级矿工”的比赛。规则为:Rusty和Drill轮流搬运矿物,每一次必须在任意一个矿物堆上面,把一定重量的矿物(至少1KG)搬到前一个离门口更近的矿物堆之中。最后没有矿物可以搬的人输。赢者可以获得“超级矿工”的称号
基于“Lady First”原则,Rusty小姐是先手(第一个开始搬运矿物的人),给出每个矿物堆的总重量,判断Rusty是否存在必胜策略
Input
第一行一个整数N,代表共有N组测试数据
每组测试数据两行
每组数据的第一行是整数n,代表有n个矿物堆 (1<n<40)
第二行是n个整数a1,a2,a3……..an.代表着离门口距离由近到远的这N个矿物堆,每一个的重量。
Output
如果Rusty存在必胜策略,那么输出“YES”,否则输出“NO”
Sample Input
1
6
1 3 2 4 3 5
Sample Output
NO
解题思路:
Nim博弈问题,对于这个题,从第1堆到第n堆,所有奇数堆的重量全部异或,0则先取必败,非0则先取必胜。
#include<iostream>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--)
{
int n;
cin>>n;
int ans = 0;
for(int i=0;i<n;++i)
{
int t = 0;
cin>>t;
if(i%2==0)
ans ^= t;
}
if(ans==0)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
最后欢迎大家访问我的个人网站: 1024s