HDU1850-Being a Good Boy in Spring Festival-博弈论

来源:互联网 发布:js 过滤表情符号 编辑:程序博客网 时间:2024/05/16 04:57

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1850

题意:
输出:从必胜局势转化成必败局势的方法数

首先应当知道必败局势有:所有牌数 异或 和为0

从必胜局势转化为必败局势:减少一个牌数使得 所有异或和为0

只要求出能够通过减少牌数来使得 所有异或和为0 的 堆数



(1) 所有终结点是必败点(P点);(2) 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点);(3)无论如何操作, 从必败点(P点)都只能进入必胜点(N点).必须明确一点:所有异或值若为 0则为必败局势(奇异局势) 否则为为必胜局势(非奇异局势)对于第二点:假设有以下数据a,b,c,d,e,f,g,h,i...(这些表示数字)k=(b^c^d^e^f....)  k是除了a外的所有异或值如果a>k 则表示能通过拿走 a-k个数来使得局势变为必败

/*(1) 所有终结点是必败点(P点);(2) 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点);(3)无论如何操作, 从必败点(P点)都只能进入必胜点(N点).必须明确一点:所有异或值若为 0则为必败局势(奇异局势) 否则为对于第二点:假设有以下数据a,b,c,d,e,f,g,h,i...(这些表示数字)k=(b^c^d^e^f....)  k是除了a外的所有异或值如果a>k 则表示能通过拿走 a-k个数来使得局势变为必败*/#include<cstdio>#include<cstring>const int N=101;int main(){    int s[N];    int n,sum,ans;    while(scanf("%d",&n),n){        sum=ans=0;        for(int i=0;i<n;++i){            scanf("%d",&s[i]);            sum^=s[i];        }        for(int i=0;i<n;++i)if(s[i]>(sum^s[i]))            ans++;        printf("%d\n",ans);    }}



0 0
原创粉丝点击