• ACM: NBUT 1107 盒子游戏


     NBUT 1107  盒子游戏
    Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:
    Appoint description: 

    Description

    有两个相同的盒子,其中一个装了n个球,另一个装了一个球。Alice和Bob发明了一个游戏,规则如下:Alice和Bob轮流操作,Alice先操作每次操作时,游戏者先看看哪个盒子里的球的数目比较少,然后清空这个盒子(盒子里的球直接扔掉),然后把另一个盒子里的球拿一些到这个盒子中,使得两个盒子都至少有一个球。如果一个游戏者无法进行操作,他(她)就输了。下图是一个典型的游戏: 
    面对两个各装一个球的盒子,Bob无法继续操作,因此Alice获胜。你的任务是找出谁会获胜。假定两人都很聪明,总是采取最优策略。 

    Input

    输入最多包含300组测试数据。每组数据仅一行,包含一个整数n(2<=n<=10^9)。输入结束标志为n=0。

    Output

    对于每组数据,输出胜者的名字。

    Sample Input

    2 
    3 
    4 
    0
    

    Sample Output

    Alice 
    Bob 
    Alice
    

    Hint



    //思维题,简单博弈,直接插入走火入魔的题解。。。
    
    
    //AC代码【递归写法】:
    #include"algorithm"
    #include"iostream"
    #include"cstring"
    #include"cstdlib"
    #include"cstdio"
    #include"string"
    #include"vector"
    #include"queue"
    #include"cmath"
    #include"map"
    using namespace std;
    typedef long long LL ;
    #define memset(x,y) memset(x,y,sizeof(x))
    #define memcpy(x,y) memcpy(x,y,sizeof(x))
    #define FK(x) cout<<"["<<x<<"]
    "
    #define bigfor(T)  for(int qq=1;qq<= T ;qq++)
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    
    int fun(int n) {
    	int i=1;
    	while(i<n) {
    		i=i*2+1;
    		if(i==n)
    			return 1;
    	}
    	return 0;
    }
    int main() {
    	int n;
    	while(~scanf("%d",&n)) {
    		if(!n)break;
    		if(fun(n))
    			printf("Bob
    ");
    		else
    			printf("Alice
    ");
    	}
    }
    
    
    
    //AC代码【幂写法】:

    #include"algorithm"
    #include"iostream"
    #include"cstring"
    #include"cstdlib"
    #include"cstdio"
    #include"string"
    #include"vector"
    #include"queue"
    #include"cmath"
    #include"map"
    using namespace std;
    typedef long long LL ;
    #define memset(x,y) memset(x,y,sizeof(x))
    #define memcpy(x,y) memcpy(x,y,sizeof(x))
    #define FK(x) cout<<"["<<x<<"]
    "
    #define bigfor(T)  for(int qq=1;qq<= T ;qq++)
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    
    
    int main() {
    	int n;
    	while(~scanf("%d",&n)) {
    		if(!n)break;
    		if(n%2==0) {
    			puts("Alice");
    			continue;
    		}
    		n+=1;
    		while(n) {
    			if(n==1) {
    				puts("Bob");
    				break;
    			}
    			if(n%2) {
    				puts("Alice");
    				break;
    			}
    			n/=2;
    		}
    	}
    	return 0;
    }
    
    
    

      


     
  • 相关阅读:
    层模型--绝对定位(position:absolute)
    什么是层模型?
    浮动模型
    流动模型(二)
    插值方法
    CFS调度分析(内核版本:2.6.34)
    CRC检验
    ubuntu误删home目录
    随想
    Android——Activity生命周期
  • 原文地址:https://www.cnblogs.com/HDMaxfun/p/5782463.html
Copyright © 2020-2023  润新知