hdu 1850 Being a Good Boy in Spring Festival

来源:互联网 发布:淘宝上卖视频自动发货 编辑:程序博客网 时间:2024/06/14 04:55

题目链接:点这里

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

35 7 90

Sample Output

1

【分析】

算是nim博弈的问题吧。直接求nim和,如果为0说明先手必败。然后去除某一个数据之后求nim和,如果和小于或等于去掉的数,说明改变后就是0,也就是必败态,说明这种改变是可行的,然后这样统计起来就行了。

【代码】

#include<iostream>#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>#include<vector>#include<cmath>#include<stdlib.h>#include<time.h>#include<stack>#include<set>#include<map>#include<queue>#include<sstream>using namespace std;#define rep0(i,l,r) for(int i = (l);i < (r);i++)#define rep1(i,l,r) for(int i = (l);i <= (r);i++)#define rep_0(i,r,l) for(int i = (r);i > (l);i--)#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)#define MS0(a) memset(a,0,sizeof(a))#define MS_1(a) memset(a,-1,sizeof(a))#define MSinf(a) memset(a,0x3f,sizeof(a))#define inf 0x3f3f3f3f//#define lson i<<1,l,mid//#define rson ((i<<1)|1),mid+1,r#define uint unsigned inttypedef pair<int,int> PII;#define A first#define B second#define pb push_back#define MK make_pair#define ll long longtemplate<typename T>void read1(T &m) {    T x=0,f=1;    char ch=getchar();    while(ch<'0'||ch>'9') {        if(ch=='-')f=-1;        ch=getchar();    }    while(ch>='0'&&ch<='9') {        x=x*10+ch-'0';        ch=getchar();    }    m = x*f;}template<typename T>void read2(T &a,T &b) {    read1(a);    read1(b);}template<typename T>void read3(T &a,T &b,T &c) {    read1(a);    read1(b);    read1(c);}template<typename T>void out(T a) {    if(a>9) out(a/10);    putchar(a%10+'0');}template<typename T>void outn(T a) {    if(a>9) out(a/10);    putchar(a%10+'0');    puts("");}using namespace std;///------------------------------------------------------------------------------------int num[105];int main() {//    freopen("in.txt","r",stdin);    int len;    while(scanf("%d",&len),len)    {        int x=0;        rep0(i,0,len)        {            read1(num[i]);            x^=num[i];        }        if(x==0)         {            printf("0\n");            continue;        }        int ans=0;        rep0(i,0,len)        if((x^num[i])<num[i])            ans++;        printf("%d\n",ans);    }    return 0;}

【续】

这题可能是数据有问题,因为x^num[i]只有小于num[i]的时候才算解,但是我开始写的是可以等于,没想到居然还是对的。

原创粉丝点击