博弈大师(牛客月赛48)

一堆数量为 nnn 的石子摆在牛牛和牛妹面前,由于双方都是博弈大师,它们打算一决高下。

经过双方讨论后决定的游戏规则:采取回合制游戏,双方轮流操作一回合。第 iii 回合的操作者会从石头堆中拿走 iii 个石子 ((( 第 111 回合拿走 111 个,第 222 回合拿走 222 个,以此类推 )))。若第 iii 回合的时候,石子的总数小于 iii,那么该回合的操作者会输掉比赛。由于牛牛是个绅士牛,所以打算第一回合让牛妹先操作,第二回合牛牛操作,第三回合再次轮到牛妹操作。

除此之外,牛牛拥有 aaa 张技能卡,牛妹拥有 bbb 张。

技能卡的作用:技能卡可以在任意时刻发动,每个回合任意一方可以发动多次,每次消耗一张卡。发动技能卡时,可以改变当前回合的操作者。

例如第 iii 回合是牛牛操作,此时无论谁发动该回合的第一张技能卡,第 iii 回合的操作者就会变成牛妹。如果此时有人发动该回合的第二张卡,那么操作者又会变成牛牛,以此类推,直到该回合双方都不再发动技能卡,此时操作者再进行操作。

需要注意的是,如果该回合使用了卡导致操作者最终发生了改变,那么下一回合的初始操作者也随之改变。例如:第一回合是牛妹操作,牛牛使用了一张卡,这一回合实际操作者是牛牛,那么第二回合的初始操作者就会是牛妹。

问:双方都采取最佳策略,谁会是这场比赛的胜利者?

分析:

1.谁的卡多谁就能保证自己赢。

2.如果俩人的卡数目相同考虑n的取值范围。推出i=1:n=1,2牛妹赢;i=2,n=3,4,5牛牛赢;i=3,n=6,7,8,9牛妹赢......下标为奇数,牛妹赢;偶数,牛牛赢。

所以通过输入的n来确定具体的i为多少即可。

看每个i的第一项排列为1,3,6,10,15。通项an = (n+1)* n / 2;输入的n一定是大于等于an的,故(n+1)* n / 2 <= x,得到 n* n / 2 < x,即n > sqrt(2*x),此时的n为下界。代回:

LL p = sqrt(2*n);

while(1ll * p * (p+1) / 2 < n) ++p;

 此时的p即为对应下标,做出相应判断即可

代码如下:(注意开long long)

       int tt;
	   cin >> tt;
	   
	   while(tt--){
			LL n, a, b;
			cin >> n >> a >> b;

			if(a > b){
				puts("niuniu");
			}
			else if(a < b){
				puts("niumei");
			}
            else{
			LL p = sqrt(2*n);
            while(1ll * p * (p+1) / 2 < n) ++p;
            puts((p & 1) ? "niumei":"niuniu");
           }
	   }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值