• POJ 2484 A Funny Game


    题意:

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

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

    Solution

    可以发现,当\(n\)小于等于\(2\)\(Alice\)嬴。当\(n\)等于\(3\)\(4\)\(Bob\)嬴。

    之后的情况可以这么想:

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

    这样可以保证什么呢?在这样两轮操作后,整个环会被划分成两段,而这两段的长度是相等的,而且此时先手还是\(Alice\)。这样\(Alice\)取什么,\(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;
    }
    
    
  • 相关阅读:
    Travis 编译使用 JDK 的版本
    《程序员的职业素养》读书笔记
    先做人,在做事
    CAP理论
    ZGC实践
    虚拟化技术的分类及介绍
    C# AD域验证登录
    dotnet core 3.1 站点发布成windows服务
    windows 服务无法调用office word COM接口
    Ext 动态加载js文件
  • 原文地址:https://www.cnblogs.com/AWhiteWall/p/12320677.html
Copyright © 2020-2023  润新知