hdu1850Being a Good Boy in Spring Festival NiM博弈

//当该点时p-position时,先手输

//当该点为n-position时,即a1^a2......^an = k时;

//先手的第一步是使得a1^a2^.......^an^k = 0;

//那么只要ai^k < ai就行

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std ;

const int maxn = 10000010 ;

int num[maxn] ;

int main()

{

// freopen("in.txt","r",stdin);

int  n ;

while(scanf("%d",&n)&&n)

{

int sum = 0 ;

for(int i = 1;i <= n ;i++)

{

scanf("%d" ,&num[i]) ;

sum^=num[i] ;

}

if(sum == 0)

{

printf("0\n") ;

continue ;

}

int ans = 0 ;

for(int i = 1;i <= n ;i++)

{

int t = num[i]^sum ;

if(t < num[i])

ans++ ;

}

printf("%d\n",ans );

}

return 0;

}

时间: 2024-11-05 10:22:06

hdu1850Being a Good Boy in Spring Festival NiM博弈的相关文章

HDU 1850 Being a Good Boy in Spring Festival(nim博弈)

题目地址:HDU 1850 这个博弈论异或这个地方感觉真绕,仔细想了一下,终于把它给理清楚了.总结一下之前不太理解的: 1:在当前操作中,只要可以达到某个必败态,那这个点一定是必胜态的,因为要想获胜,肯定会选择必败态的操作. 2:只有当所有值的异或值为0的时候,才是必败态,所以说对于N堆的nim游戏来说,第一步的操作对于每一堆来说只能有至多一种可以形成必败态.因为另外(n-1)堆的异或值是唯一的,所以当前堆也是唯一的. 3:对于每一堆来说,只要可以剩下一个数,使得这个数与另外(n-1)堆的异或值

HDU-1850-Being a Good Boy in Spring Festival【Nim博弈】

Being a Good Boy in Spring Festival Problem Description 一年在外 父母时刻牵挂 春节回家 你能做几天好孩子吗 寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场 悄悄给爸爸买个小礼物 主动地 强烈地 要求洗一次碗 某一天早起 给爸妈用心地做回早餐 如果愿意 你还可以和爸妈说 咱们玩个小游戏吧 ACM课上学的呢- 下面是一个二人小游戏:桌子上有M堆扑克牌:每堆牌的数量分别为Ni(i=1-M):两人轮流进行:每走一步可以任意选择一堆并取走其中的任意张

HDU1850 Being a Good Boy in Spring Festival(NIM)

典型nim博弈题,全部异或完以后,sum=0为必败条件. 题目问的是有多少种构造必败的方法. 假设我们取第i堆石子,则其余n-i堆石子不变,状态可以由(sum^i)表示. 如果我们取完这堆石子,使(sum^i)^(new)i=0则成功构造必败条件. 显然这里的(new)i要与(sum^i)相等,所以只需要当前的i>(sum^i)即可构造出必败条件. 遍历一遍统计就好了. #include <iostream> #include <cstdio> #include <cs

hdu 1850 Being a Good Boy in Spring Festival(Nimm Game)

题意:Nimm Game 思路:Nimm Game #include<iostream> #include<stdio.h> using namespace std; int main(){ int m,a[128],i,sum,ans; while(~scanf("%d",&m)&&m){ sum=0; for(i=0;i<m;++i){ scanf("%d",&a[i]); sum^=a[i]; }

[Nim博弈]hdu 1850 Being a Good Boy in Spring Festival

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1850 Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4053    Accepted Submission(s): 2394 Problem Description

hdu1850 Being a Good Boy in Spring Festival(nim博弈)

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6682    Accepted Submission(s): 4039 Problem Description 一年在外 父母时刻牵挂 春节回家 你能做几天好孩子吗 寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场 悄悄

HDU 1850 Being a Good Boy in Spring Festival (Nim游戏变形)

题意:经典Nim游戏博弈,给你n堆牌,每堆a[i]张,每次能从一堆中取出任一张(不能为0),最后不能取者为输 问先手有几种取法保证他最后能获胜. 思路:让Nim_sum=0(a[1]^a[2]----^a[n]=0)时则输,利用这个定理,对于第i堆a[i],除了第i堆,其它的 Nim_sum=k,如果a[i]>k,则先手从第i堆可以取a[i]-k张牌,让a[i]=k,最后a[i]^k==0. #include<cstdio> #include<stdlib.h> #inclu

HDU 1850 Being a Good Boy in Spring Festival (Nim博弈)

#include <iostream> #include <algorithm> #define ss(a) scanf("%d",&a) #define ss64(a) scanf("%I64d",&a) using namespace std; int main() { int a[100],i,n,m,sum,cnt,j; while(~ss(n),n) { cnt=0; for (i=0,sum=0;i<n;i+

hdu 1850 Being a Good Boy in Spring Festival (尼姆博弈)

Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4658    Accepted Submission(s): 2781 Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场悄悄给爸爸买