标签:博弈
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4994
题意:有n堆石子,每个堆有Ai个石头,,两人轮流拿石子,可以取一堆中的一颗到多颗,但是必须取完其中一堆才能开始取下一堆,最后谁拿石子,谁赢
思路:模拟几遍容易发现,谁先取得大于1的石子堆,谁就拥有了主动权,就能获得胜利,换句话说,当碰到的都是1时,那么两个人都没有选择权,根据石子堆数确定谁赢谁输,如果过程中出现大于1的堆数时,那么这个人就能通过拿ai-1个或者ai个来保证每次在大于1的堆数上都自己先拿,这样就会取得胜利
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#define debug "output for debug\n"
#define pi (acos(-1.0))
#define eps (1e-8)
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int maxn = 100005;
int main()
{
int t;
int n;
int a[maxn];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int sum=0;
int flag=0;
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
for(int i=0; i<n; i++)
if(a[i]!=1)
{
flag=1;
sum=i+1;
break;
}
if(flag==0)
{
if(n%2==0)
printf("No\n");
else
printf("Yes\n");
}
else
{
if(sum%2)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:博弈
原文地址:http://blog.csdn.net/li1004133206/article/details/47272149