(hnust 1459)取石子游戏2(博弈)

来源:互联网 发布:c语言机器人编程代码 编辑:程序博客网 时间:2024/06/08 12:38

时间限制: 1 Sec 内存限制: 128 MB
提交: 12 解决: 5
[提交][状态][讨论版]
题目描述
Kerwin 和 Lester是一对好Basefriend,在“六一光棍节”这天,他们漫步校园,来到了一个石子堆前。
Kerwin决定戏耍一下Lester,以便让他为自己的晚饭买单,以解救自己羞涩的钱包。Kerwin来到石子堆前,抓了一把石子,分成了几堆,说道:“Lester,咱们来玩个游戏吧。”“什么游戏?”“你看,这里有几堆石子,我们轮流从其中一堆拿走一个或者两个石子,由我先取,如果谁取走了最后一颗石子谁输。嗯,输一局请对方一顿饭。”Lester听完规则,微微一下“好啊!”Kerwin虽然对于Lester的微笑心下有些底气不足,但是也没法多想。
果不其然,几局过后,Kerwin输得一塌糊涂,已经欠下了一个月的晚饭了。Kerwin心下很是气恼。Lester一看Kerwin的恼怒样,决定再刺激他一下“最后一局来把大的吧,你赢了,咱俩扯平,反之,你多输半个月的。怎么样,划算吧?”
一直在关注着他们俩的你,在一旁也看不下去了。在Kerwin做出决定前,你发现了Lester获胜的原因。你告诉了Kerwin最佳策略。
Kerwin并不愚蠢,知晓最佳策略后,他立即知道了最佳策略下,游戏的结果。
那么他是否应该答应Lester的挑战呢?

输入
一个正整数T(1 ≤ T ≤ 100),表示有T组数据。
以下每组数据各有两行输入
第一行包含两个正整数N(1 ≤ N ≤ 100000),表示有N堆石子。
第二行包含N个正整数Ai(1 ≤ i ≤ N, 1 ≤ Ai ≤ 100000)表示第i堆石子有Ai个石子。

输出
每组数据输出一行,包含一个字符串,当Kerwin有必胜策略时,输出“Yes”,当Kerwin必败时,输出“No”。(在Lester采取最佳策略的情况下)

样例输入
2
1
1
2
1 2
样例输出
No
Yes
提示
来源
wxDIY

分析:两个人轮流从任意一堆拿走一个或者两个,像这种就会考虑,有多少队最后会剩下1个或者2个
在这题中,分析可知,只有当不是3的倍数的若干堆中
情况1:所有的都是1且是偶数个堆
情况2:有 奇数堆个 中有2个石子**

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,num1=0,num2=0,a;        scanf("%d",&n);        while(n--)        {            scanf("%d",&a);            if(a%3==1) num1++;            if(a%3==2) num2++;        }        if((num1%2==0&&num2==0)||num2%2==1)            puts("Yes");        else            puts("No");    }    return 0;}
原创粉丝点击