0
点赞
收藏
分享

微信扫一扫

P3150 pb的游戏(1)[洛谷]

栖桐 2022-07-31 阅读 58


P3150 pb的游戏(1)[洛谷]

  • ​​1.题目​​
  • ​​2.分析​​
  • ​​3.代码​​
  • ​​4.总结​​
  • ​​5.更新日志​​

1.题目

题目背景

(原创)
有一天 pb和zs玩游戏 你需要帮zs求出每局的胜败情况

题目描述
游戏规则是这样的: 每次一个人可以对给出的数进行分割,将其割成两个非零自然数,之后由另一个人选择留下两个数中的其中一个;之后由另一个人进行分割这个剩下的数,重复步骤……

当一个人无法对数进行分割的时候游戏结束,另一个人获胜

现在要你求出N次游戏的胜败

每局由pb先进行分割,如果pb赢输出"pb wins" 如果zs赢输出"zs wins"

注:双方都是绝顶聪明的

输入格式
第一行一个数N,表示数据组数
之后N行,每行一个数M,表示每局初始的数

输出格式
共N行,每行一串字符 表示游戏结果

样例输入 #1

5
1
3
7
20
5

样例输出 #1

zs wins
zs wins
zs wins
pb wins
zs wins

提示
1<N<50
1<=m<=1000000000

2.分析

博弈论

当n=1时,先手输
当n=2时,先手胜
假设当k=n(n>2),奇数先手输,偶数先手胜
则当k=n+1时,
分为以下两种情况
(1)n+1为奇数,则先手只可将n+1分为一个奇数一个偶数,如果此时的后手想要赢,则此时后手选择偶数,则可套用假设,则后手胜,即先手输
(2)n+1为偶数,则先手可将n+1分为两个奇数或者两个偶数,此时先手想要赢,只可分为两个奇数,则后手会输,即先手赢
综上:
奇数,先手输
偶数,先手赢

3.代码

#include <iostream>
using namespace std;

int main()
{
scanf("%*d"); //读入一个数字
int n;
while (scanf("%d", &n) != EOF)
{
if (n & 1) puts("zs wins"); //奇数先手输后手赢
else puts("pb wins");
}
return 0;
}

P3150 pb的游戏(1)[洛谷]_ios

4.总结

scanf返回值为读入的数据个数
位运算

5.更新日志

2022.7.27

欢迎交流、讨论、指正~
不正确、不理解之处欢迎评论留言~


举报

相关推荐

0 条评论