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

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

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;
}

在这里插入图片描述

4.总结

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

5.更新日志

2022.7.27

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值