zoukankan      html  css  js  c++  java
  • POJ 1740 A New Stone Game(博弈)

    A New Stone Game
    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 6586   Accepted: 3611

    Description

    Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob move the stones in turn. 
    At each step of the game,the player choose a pile,remove at least one stones,then freely move stones from this pile to any other pile that still has stones. 
    For example:n=4 and the piles have (3,1,4,2) stones.If the player chose the first pile and remove one.Then it can reach the follow states. 
    2 1 4 2 
    1 2 4 2(move one stone to Pile 2) 
    1 1 5 2(move one stone to Pile 3) 
    1 1 4 3(move one stone to Pile 4) 
    0 2 5 2(move one stone to Pile 2 and another one to Pile 3) 
    0 2 4 3(move one stone to Pile 2 and another one to Pile 4) 
    0 1 5 3(move one stone to Pile 3 and another one to Pile 4) 
    0 3 4 2(move two stones to Pile 2) 
    0 1 6 2(move two stones to Pile 3) 
    0 1 4 4(move two stones to Pile 4) 
    Alice always moves first. Suppose that both Alice and Bob do their best in the game. 
    You are to write a program to determine who will finally win the game. 
     

    Input

    The input contains several test cases. The first line of each test case contains an integer number n, denoting the number of piles. The following n integers describe the number of stones in each pile at the beginning of the game, you may assume the number of stones in each pile will not exceed 100. 
    The last test case is followed by one zero. 
     

    Output

    For each test case, if Alice win the game,output 1,otherwise output 0. 
     

    Sample Input

    3
    2 1 3
    2
    1 1
    0

    Sample Output

    1
    0
    

    Source

     

    【题意】

    对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。最后谁无子可取即输。

     

     

    【分析】

    首先我们考虑两堆相等的情况,一定是谁取谁输,因为对方永远可以做对称的操作。对于四堆,12堆相等,34堆相等的情况,一定也是先手输,后手也只需要做对称的操作(在先手取石子的对称堆中取相同多的石子,并把和先手等量的石子分给先手分配给的堆的对称堆。(若先手在3堆取,并分给1堆,那后手就在4堆取,分给2堆)。也就是说对于任意的一对一对相等的情况来说,一定是后手必胜。

      我们接下来来证明除上述情况外,所有情况都是先手必胜。因为任何一种情况都可以转化为一对一对相等的情况。若总堆数为奇数的情况,可以把石子最多的一堆的石子分配给其它堆,使得其它堆两两相等。最多一堆的石子绝对是足够多,可以完成这个补齐的任务的。因为我们把石子从小到大排序后画成条形统计图。把相邻两个分成一组(12一组,34一组……)我们需要用第n堆填补135……堆我们把需要填补的这些差距(21高出的部分,43高出的部分……)投影到统计图左侧的y轴上,我们会发现这是一些不连续的区间,其长度总和明显小于第n堆。所以可以补齐。

      对于堆数为偶数的情况。我们把最多的一堆削弱到和最少的一堆一样多,并把拿掉的石子分给别的堆,使其一对一对地相等。可行性于前面奇数情况同理。

    所以只要判断是不是一对一对的相等的情况即可。

     

    【代码】

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,a[11]; 
    int main(){
    	while(scanf("%d",&n)==1&&n){
    		for(int i=1;i<=n;i++) scanf("%d",a+i);
    		if(n&1) puts("1");
    		else{
    			bool flag=0;
    			sort(a+1,a+n+1);
    			for(int i=1;i<=n;i+=2){
    				if(a[i]!=a[i+1]){
    					flag=1;
    					puts("1");
    					break;
    				}
    			}
    			if(!flag) puts("0");
    		}
    	}
    	return 0;
    } 

     

  • 相关阅读:
    Cf的一些总结
    Goodbye 2019
    牛客多校第8场 A题
    19牛客多校第二场 H题
    Hihocoder1673
    记一次根据图片原尺寸设置样式,并进行缩放和拖拽
    鱼骨时间轴案例(转自CSDN,原文链接附于文中)
    jQuery横向上下排列鱼骨图形式信息展示代码时光轴样式(转自CSDN,原文链接附于文中)
    mxGraph实现鱼骨图(因果图)(转自CSDN,链接附于文中)
    erlang win64位包下载链接
  • 原文地址:https://www.cnblogs.com/shenben/p/10420783.html
Copyright © 2011-2022 走看看