poj 3975&&hdu 1850 (nim)

//先手能赢
//从n堆石头中的一堆里去掉几颗,有多少堆石头可取
# include <stdio.h>
# include <string.h>
# include <algorithm>
using namespace std;
int main()
{
    int n,sum,i,j,a[1010],cot,vis[1010];
    while(~scanf("%d",&n),n)
    {
        sum=0;

        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        memset(vis,0,sizeof(vis));
        cot=0;
        for(i=0;i<n;i++)
        {
            sum=0;
           vis[i]=1;
            for(j=0;j<n;j++)
            {
                if(!vis[j])
                  sum^=a[j];
            }
            vis[i]=0;
            if(a[i]>sum)//要异或到零的状态,因为要取出几个石头,所有a[i]要大于sum,相同的两个数异或为零
                cot++;
        }
        printf("%d\n",cot);
    }
    return 0;
}

时间: 2024-08-07 21:20:05

poj 3975&&hdu 1850 (nim)的相关文章

HDU 1850 (Nim博弈 取胜方案数) Being a Good Boy in Spring Festival

考虑到Bouton定理的证明过程,设n个数的Nim和(异或和)为X,其最高位的1在第k位,那么n个数中一定有个y的第k为也是个1. 将y的数量变为X xor y,那么n的数的Nim和为0,便转为先手必败局面. 所以先手有多少种取法,就看n个数里面有多少个y,满足二进制的第k为是个1. 1 #include <cstdio> 2 3 const int maxh = 20; 4 const int maxn = 100 + 10; 5 int a[maxn]; 6 7 int main() 8

[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

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博弈)

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

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 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场悄悄给爸爸买

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): 4557    Accepted Submission(s): 2713 Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场

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]; }

POJ 2411 &amp;&amp; HDU 1400 Mondriaan&#39;s Dream (状压dp 经典题)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12341   Accepted: 7204 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

poj 1226 hdu 1238 Substrings 求若干字符串正串及反串的最长公共子串 2002亚洲赛天津预选题

题目:http://poj.org/problem?id=1226 http://acm.hdu.edu.cn/showproblem.php?pid=1238 其实用hash+lcp可能也可以,甚至可能写起来更快,不过我没试,我最近在练习后缀数组,所以来练手 后缀数组的典型用法之一----------------后缀数组+lcp+二分 思路:1.首先将所有的字符串每读取一个,就将其反转,作为一组,假设其下标为i到j,那么cnt[i]到cnt[j]都标记为一个数字(这个数字意思是第几个读入的字符