hdu1850+2176(尼姆博弈)

原创 2013年12月04日 17:17:28

Being a Good Boy in Spring Festival

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3456    Accepted Submission(s): 2031


Problem Description
一年在外 父母时刻牵挂
春节回家 你能做几天好孩子吗
寒假里尝试做做下面的事情吧

陪妈妈逛一次菜场
悄悄给爸爸买个小礼物
主动地 强烈地 要求洗一次碗
某一天早起 给爸妈用心地做回早餐

如果愿意 你还可以和爸妈说
咱们玩个小游戏吧 ACM课上学的呢~

下面是一个二人小游戏:桌子上有M堆扑克牌;每堆牌的数量分别为Ni(i=1…M);两人轮流进行;每走一步可以任意选择一堆并取走其中的任意张牌;桌子上的扑克全部取光,则游戏结束;最后一次取牌的人为胜者。
现在我们不想研究到底先手为胜还是为负,我只想问大家:
——“先手的人如果想赢,第一步有几种选择呢?”
 

Input
输入数据包含多个测试用例,每个测试用例占2行,首先一行包含一个整数M(1<M<=100),表示扑克牌的堆数,紧接着一行包含M个整数Ni(1<=Ni<=1000000,i=1…M),分别表示M堆扑克的数量。M为0则表示输入数据的结束。
 

Output
如果先手的人能赢,请输出他第一步可行的方案数,否则请输出0,每个实例的输出占一行。
 

Sample Input
3 5 7 9 0
 

Sample Output
1
 

Author
lcy
 

Source
 
     本题是个简单的尼姆博弈。求得所有堆的异或和sum.然后扫描每堆,若Ni大于sum(除去当前堆的),则异或和大于0,必胜局,可选该堆,到底选多少呢?肯定不能随便拿,即拿了之后要保证sum^Ni等于0,即为必败局,故只能取Ni-sum这一种情况;否则不能选。
import java.util.Scanner;


public class hdu1850 {
	public static void main(String[] str)
	{
		int[] f=new int[110];
		Scanner input=new Scanner(System.in);
		do
		{
			int n=input.nextInt();
			if(0==n)break;
			int sum=0;
			for(int i=0;i<n;i++)
			{
				f[i]=input.nextInt();
				sum^=f[i];
			}
			
			int ans=0;
			for(int i=0;i<n;i++)
			{
				sum^=f[i];
				if(f[i]>sum)ans++;
				sum^=f[i];
			}
			System.out.println(ans);
		
		}while(true);
	}

}
 
 
 
hdu2176
import java.util.Scanner;


public class hdu2176 {
	static Scanner input=new Scanner(System.in);
	public static void main(String[] str)
	{
		while(true)
		{
			int m=input.nextInt();
			if(0==m)break;
			int []Stone=new int[m];
			int sum=0;
			for(int i=0;i<m;i++)
			{
				Stone[i]=input.nextInt();
				sum^=Stone[i];
			}
			
			
			if(0==sum)
				System.out.println("No");
			else
			{
				System.out.println("Yes");
				for(int i=0;i<m;i++)
				{
					sum^=Stone[i];
					if(Stone[i]>sum)
					{
						System.out.println(Stone[i]+" "+sum);
					}
					sum^=Stone[i];
				}
			}
		}
	}

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

编程之美1.12 尼姆博弈拓展的分析与论证

在书籍《编程之美》中,总共讲述了三个关于取石子博弈的问题。书中对这三个博弈问题的本身都有详细的解答。然而,看懂这些解答本身并不是一件难事。我们学知识呢,应该学会举一反三,这样才算是真正掌握了知识,同时...
  • MathThinker
  • MathThinker
  • 2015年08月18日 19:41
  • 1119

阶梯博弈算法详解(尼姆博弈进阶)

1.什么是阶梯博弈? 阶梯的序号如图所示,地面表示第0号阶梯。每次都可以将一个阶梯上的石子向其左侧移动任意个石子,没有可以移动的空间时(及所有石子都位于地面时)输。 2.阶梯博弈的算法 阶梯博弈...
  • qq_30241305
  • qq_30241305
  • 2016年07月19日 16:03
  • 1310

博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)

一.  巴什博奕(Bash Game)   A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30。这应该是最古老的关于巴什博奕的游戏了吧。 其实如果知道原理,这游戏一点运气成分都没有,只和先...
  • AC_Gibson
  • AC_Gibson
  • 2014年11月30日 18:37
  • 4923

hdu-2176-取(m堆)石子游戏-尼姆博弈 -输出取法

取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota...
  • chao1983210400
  • chao1983210400
  • 2013年08月23日 17:40
  • 604

尼姆博弈 HDU2176

有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇...
  • ccutsoft20144264
  • ccutsoft20144264
  • 2015年03月20日 22:09
  • 233

ACM-尼姆博弈之取(m堆)石子游戏——hdu2176

ACM 尼姆博弈 取(m堆)石子游戏 hdu2176 改变奇异态
  • lx417147512
  • lx417147512
  • 2014年05月02日 15:40
  • 1923

hdu 1850 尼姆博弈

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/3...
  • qaz135135135
  • qaz135135135
  • 2016年07月29日 17:00
  • 90

hdu 1850 Being a Good Boy in Spring Festival 博弈论之尼姆博弈,,都被自己蠢哭了!

Problem Description 一年在外 父母时刻牵挂 春节回家 你能做几天好孩子吗 寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场 悄悄给爸爸买个小礼物 主动地 强烈地 要求洗一次碗 某一天...
  • Lionel_D
  • Lionel_D
  • 2015年02月25日 21:49
  • 712

ACM-尼姆博弈之Being a Good Boy in Spring Festival——hdu1850

ACM 尼姆博弈 Being a Good Boy in Spring Festival hdu1850
  • lx417147512
  • lx417147512
  • 2014年05月02日 15:47
  • 1359

hdu1850(尼姆博弈)

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/3...
  • xj2419174554
  • xj2419174554
  • 2013年12月04日 17:15
  • 614
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu1850+2176(尼姆博弈)
举报原因:
原因补充:

(最多只允许输入30个字)