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

xiaoxiao2021-02-28  88

时间限制: 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; }
转载请注明原文地址: https://www.6miu.com/read-64809.html

最新回复(0)