POJ_2975 Nim(Nim)

题目请点我

题解:

题目还是经典的Nim游戏,但是结果要输出所有可能的“winning move”.Nim游戏终究还是二进制异或的问题。先考虑输赢,如果异或结果等于0,则必败。当异或结果不等于0,一种情况为结果等于2^x,也就是说某位上奇数个1,所以我们拿走任意一个都可以;另一种情况结果!=2^x,所以存在多个位上有奇数个1,解决方案是拆掉最高位1,使其他位满足有偶数个1,只有一种解法。所以关键就在于统计个数了,利用异或的性质,将所有数异或的结果与原数比较,如果小于原数,则原数一定包含指定位置上的1(第二种情况,若包含最高位1也并定会减少)。很巧妙的方法找到满足条件的数的个数。

代码实现:

#include <iostream>
#define MAX 1010

using namespace std;

int N;
int res;
int num[MAX];
int main()
{
    while( cin>>N && N ){
        res = 0;
        int tmp = 0;
        for( int i = 0; i < N; i++ ){
            cin>>num[i];
            tmp ^= num[i];
        }
        if( !tmp ){
            cout<<0<<endl;
        }
        else{
            for( int i = 0; i < N; i++ ){
                if( (tmp^num[i]) < num[i] ){
                    res++;
                }
            }
            cout<<res<<endl;
        }
    }
    return 0;
}

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

时间: 2024-08-30 06:54:09

POJ_2975 Nim(Nim)的相关文章

zoj3591 Nim(Nim博弈)

ZOJ 3591 Nim(Nim博弈) 题目意思是说有n堆石子,Alice只能从中选出连续的几堆来玩Nim博弈,现在问Alice想要获胜有多少种方法(即有多少种选择方式). 方法是这样的,由于Nim博弈必胜的条件是所有数的抑或值不为0,证明见  点击  ,所以答案就转化为原序列有多少个区间的亦或值为0,用n*(n+1) / 2 减去这个值就可以了. 而求有多少个区间的亦或值为0,实际上就是求对于亦或值的前缀nim[i],满足nim[i] == nim[j] 的对数,这时只要对nim数组排序就可以

[zoj3591]Nim 游戏

题意:有n堆火柴,选择连续若干堆火柴进行Nim游戏,求让先手胜的选择方案数. 思路:让先手胜等同于这些数的异或值不同于0,不妨转化为求让先手败的方案数.此时记录一个前缀的异或和val[i],那么答案就是count({i,j})(0<=i<j<n,val[i]=val[j])+count(i)(val[i]=0).直接map统计可能超时,不妨考虑离线做,把val数组sort一下答案就不难得到了,不要忘记最后用总方案数减一下. 1 #pragma comment(linker, "

nim和面向对象(一)

Nim and OO 原文链接:http://goran.krampe.se/2014/10/29/nim-and-oo/ 作者:Roads less Taken A blend of programming, boats and life. 时间:2014,10,29 Nim is presented as an imperative language. And yes, it has some of its roots in the Pascal line of languages, but

使用prismjs为网站添加代码高亮功能

prismjs 是一款轻量.可扩展的代码语法高亮库,使用现代化的 Web 标准构建,使用 Prismjs 可以快速为网站添加代码高亮功能,支持超过113中编程语言,还支持多种插件,是简洁.高效的代码高亮解决方案.科技爱好者博客就是使用了Prism.js 实现漂亮的代码语法高亮功能,本文教你如何在wordpress上快速使用Prismjs实现代码高亮. 一.下载JS和CSS文件并上传到网站根目录. 在Prismjs网站下载页面下载需要的JS和CSS文件,下载页面: http://prismjs.c

Part.4【博弈论】

---恢复内容开始--- 不要问我为什么突然跳到Part.4,我懒得解释. 在蔡大神的论文+讲解和HZW的题库下,自己大概是明白什么是博弈论的皮毛了吧. 先说SG定理吧. 对于游戏中的状态,我们给每个状态定义一个必胜态和必败态.区别在于前者可以通过一次操作到达必败态,但后者无法做到(后者在一次操作后所能到达的状态全部都为必胜态) 接着引进SG函数,每个状态都有一个SG值,这个值由它所能到达的状态的SG值决定.(这里的所能到达的状态指的是经过一次操作能到达的状态,下同) SG值有以下性质: SG值

Si2155

http://www.edom.com.tw/cn/index.jsp?m=prodview&id=1702 Description:新型的Si2155 电视调谐器IC扩展了Silicon Labs公司经过市场验证和业界领先的硅电视调谐器架构,使其进入高速增长的数字电视和机顶盒(STB)新兴市场. Si2155电视调谐器IC具有业界领先的RF性能,与Silicon Labs公司曾获奖的Si217x电视调谐器一样设计简便,而Si217x已经被世界前七大电视品牌厂商中的五大厂商大量采用.Si2155

HackerRank &quot;Vertical Rooks&quot;

Please note: VROOK cannot go back-ward - that leads to a simple variation to Game of Nim: just XOR. t = int(input()) for _ in range(t): n = int(input()) # Get input p1 = [] for _ in range(n): p1.append(int(input())) p2 = [] for _ in range(n): p2.appe

linux查看端口及端口详解

今天现场查看了TCP端口的占用情况,如下图 红色部分是IP,现场那边问我是不是我的程序占用了tcp的链接,,我远程登陆现场查看了一下,这种类型的tcp链接占用了400多个,,后边查了一下资料,说ESTABLISHED状态 ESTABLISHED的意思是建立连接.表示两台机器正在通信.      之后查找  ncube-lm  发现ncube-lm是一个端口,是nCube License Manager (即ncube管理的一个许可证明),意思是被允许,被认证开放的意思,,, 之后查看端口号 是1

博弈SG函数

转自:Sprague-Grundy Function-SG函数--博弈论(3) 公平游戏的Sprague-Grundy定理 公平游戏是一种双人游戏,在游戏中双方都有完整的信息,没有牵涉,任何状态的合法操作对双方来说都是相同的. 一个公平游戏可以抽象地用一个有向无环图来表示,这个图中每个点都对应这一个状态,每条有向边代表从一个状态到另一个状态的合法操作. 我们可以想象一个代币最初放在某个点上,然后两个玩家轮流将其从当前的点移动到它的后继点.当代币移动到汇点时游戏结束,汇点是一个没有出度的点,最后一