【POJ 2484】A Funny Game

题意:

Alice 和 Bob 在玩一个无聊的游戏,n个棋子围成一圈,两人轮流从中取走一或两个棋子,不过取两个时必须是连续的棋子。

棋子取走之后留下空位,相隔空位的棋子不连续。Alice先取,取走最后一个棋子的人赢。如果都采取最优策略,谁会赢?

Solution

可以发现,当 n n n小于等于 2 2 2 A l i c e Alice Alice嬴。当 n n n等于 3 3 3 4 4 4 B o b Bob Bob嬴。

之后的情况可以这么想:

  • n n n为奇数:先手选 1 1 1颗,后手选先手对面的 2 2 2颗。先手选 2 2 2颗同理。
  • n n n为偶数:先手选 1 1 1颗,后手选对面的 1 1 1颗。 2 2 2颗同理。

这样可以保证什么呢?在这样两轮操作后,整个环会被划分成两段,而这两段的长度是相等的,而且此时先手还是 A l i c e Alice Alice。这样 A l i c e Alice Alice取什么, B o b Bob Bob就取对面相同的个数,这样保证 B o b Bob Bob一定会赢。

Code

#include<cstdio>

int n;

int read() {
	int x = 0, f = 1; char s;
	while((s = getchar()) > '9' || s < '0') if(s == '-') f = -1;
	while(s >= '0' && s <= '9') {
		x = (x << 1) + (x << 3) + (s ^ 48);
		s = getchar();
	}
	return x * f;
	
}

int main() {
	while(n = read(), n) puts(n <= 2 ? "Alice" : "Bob");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值