Description

  

  传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。

  

​  本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游戏者也有这样一次机会。从第三个回合(又轮到第一个游戏者)开始,规则和Nim游戏一样。

  

  如果你先拿,怎样才能保证获胜?如果可以获胜的话,还要让第一回合拿的火柴总数尽量小。

  

Input

  

​  第一行为整数\((k(k\le1000)\)。即火柴堆数。第二行包含\(k\)个不超过\(10^9\)的正整数,即各堆的火柴个数。

  

Output

  

​  输出第一回合拿的火柴数目的最小值。如果不能保证取胜,输出-1。

  

Sample Input

  

  6

  

  5 5 6 6 5 5

  

Sample Output

  

  21

  

  

  

Solution

  

  Nim游戏先手必胜的条件是所有每一堆的数量异或和不为0。那么我们现在所要做的,是保留一个集合S,使得这个集合的每一个子集异或和都不为0。这样,不论对手从这个集合中删去哪些子集,剩余的元素异或和都不为0。同时,我们要使得删去的元素尽可能小,即选择保留的元素尽可能大。所以,我们的目的其实是构造一组权值最大的线性基。

  

  我们按照每一堆的火柴数a_i从大到小来贪心,尝试将它加入一个线性基中。如果成功加入,则视之为S中的元素;否则,则视为被舍弃的元素,统计入答案中。

  

  这样,我们就可以构造出一组权值最大的线性基。

  

  至于为什么贪心是正确的,不会出现舍弃权值较大的元素来让某些权值较小的元素顺利加入线性基这种决策,可能要用到拟阵证明,这个坑慢慢补吧。但是貌似如此的线性基的带权问题,大概都可以套用贪心的方法,应该是得益于拟阵的相似证明。

  

  

  

   

Code

  

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=105;
int n,a[N];
long long ans;
namespace LB{
const int B=30;
int a[B];
bool insert(int x){
for(int i=B-1;i>=0;i--)
if(x&(1<<i)){
if(a[i]) x^=a[i];
else{a[i]=x;break;}
}
return x;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i);
sort(a+1,a+1+n);
for(int i=n;i>=1;i--)
if(!LB::insert(a[i])) ans+=a[i];
printf("%lld\n",ans);
return 0;
}

【BZOJ3105】【CQOI2013】新Nim游戏的更多相关文章

  1. BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基

    一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...

  2. BZOJ3105: [cqoi2013]新Nim游戏

    题解: 线性基?类似于向量上的基底. 此题题解戳这里:http://blog.csdn.net/wyfcyx_forever/article/details/39477673 代码: #include ...

  3. BZOJ3105:[CQOI2013]新Nim游戏(线性基,贪心)

    Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴 ...

  4. BZOJ3105: [cqoi2013]新Nim游戏(Xor线性无关组)

    Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴 ...

  5. 【题解】 bzoj3105: [cqoi2013]新Nim游戏 (线性基+贪心)

    bzoj3105,懒得复制 Solution: 首先你要有一个前置技能:如果每堆石子异或和为\(0\),则先手比输 这题我们怎么做呢,因为我们没人要先取掉几堆,为了赢对方一定会使剩下的异或和为\(0\ ...

  6. 【贪心】【线性基】bzoj2460 [BeiJing2011]元素 / bzoj3105 [cqoi2013]新Nim游戏

    p2460: #include<cstdio> #include<algorithm> using namespace std; #define N 1001 typedef ...

  7. bzoj3105 [cqoi2013]新Nim游戏——贪心+线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3105 首先,要先手必胜,就不能取后让剩下的火柴中存在异或和为0的子集,否则对方可以取成异或和 ...

  8. 【BZOJ3105】[cqoi2013]新Nim游戏 贪心+线性基

    [BZOJ3105][cqoi2013]新Nim游戏 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个 ...

  9. bzoj 3105: [cqoi2013]新Nim游戏 异或高消 && 拟阵

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 535  Solved: 317[Submit][Stat ...

  10. 洛谷P4301 [CQOI2013]新Nim游戏

    P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...

随机推荐

  1. beego跨域请求配置

    不说废话 在main函数前加入如下代码 func init() { //跨域设置 var FilterGateWay = func(ctx *context.Context) {ctx.Respons ...

  2. docker实现跨主机连接

    实验环境: centos7系统 host1:192.168.42.128 host2:192.168.42.129 dokcer容器跨主机连接 1.使用网桥实现跨主机容器连接 2.使用Open vSw ...

  3. Tree - AdaBoost with sklearn source code

    In the previous post we addressed some issue of decision tree, including instability, lack of smooth ...

  4. IDA入门笔记

    题目来源: 南邮CTF :: RE :: Hello,RE(应该是) XDUCTF :: ??? :: ????????(不知道不知道不知道) 总而言之我会在百度网盘再上传一份: >>百度 ...

  5. Java面试中的Spring方面问题

    1.一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5发布于 2007 年.这是第一个支持注解的版本.Spring 3 ...

  6. 多线程分段下载研究的python实现(一)

    我一直对下载文件比较感兴趣.现在我下载文件大部分是用迅雷,但迅雷也有一些不如意的地方,内存占用大,一些不必要的功能太多,不可定制.尤其是最后一点.现在有些下载对useragent,cookie,aut ...

  7. halt命令详解

    基础命令学习目录首页 原文链接:https://www.jb51.net/LINUXjishu/57947.html 名称:halt 使用权限:系统管理者 halt 使用方式:halt [-n] [- ...

  8. Alpha阶段项目展示博客

    烫烫烫烫烫(hotcode5)团队 1. 团队成员的简介和个人博客地址 刘畅 博客园ID:森高Slontia 身份:PM 个人介绍: 弹丸粉 || 小说创作爱好者 || 撸猫狂魔(x || 生命的价值 ...

  9. 【quickhybrid】如何实现一个Hybrid框架

    章节目录 [quickhybrid]如何实现一个跨平台Hybrid框架 [quick hybrid]架构一个Hybrid框架 [quick hybrid]H5和Native交互原理 [quick hy ...

  10. C++ 函数 内联函数

    内联函数的功能和预处理宏的功能相似,在介绍内联函数之前,先介绍一下预处理宏.宏是简单字符替换,最常见的用法:定义了一个代表某个值的全局符号.定义可调用带参数的宏.作为一种约定,习惯上总是用大写字母来定 ...