P4301 [CQOI2013]新Nim游戏

题目描述

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

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

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

输入输出格式

输入格式:

第一行为整数\(k\)。即火柴堆数。

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

输出格式:

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


你不能让对面拿的使\(SG\)异或和为\(0\)

然后发现让整个异或集合线性无关就行了,就是形成一组基底。

然后我就傻了..居然写了边交换边插入

事实先排序就行了,从大的开始插入...


Code:

#include <cstdio>
#include <algorithm>
#define ll long long
int n,a[105],base[32];
ll ans;
int Insert(int x)
{
for(int i=30;~i;i--)
if(x>>i&1)
{
if(base[i]) x^=base[i];
else {base[i]=x;return 1;}
}
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i);
std::sort(a+1,a+1+n);
for(int i=n;i;i--) ans=ans+(Insert(a[i])?0:a[i]);
printf("%lld\n",ans);
return 0;
}

2018.12.23

最新文章

  1. C#定义类型转化 及 格式化字符串
  2. nancy中视图呈现 Html.Partial(RenderPage的替代品)
  3. Linux中exec命令相关
  4. spark新能优化之序列化的持久化级别
  5. [译]36 Days of Web Testing(三)
  6. 浅析如何在Nancy中生成API文档
  7. m个苹果放入n个盘子问题
  8. git 忽略 .idea文件
  9. yaf项目将500错误打印到页面上
  10. 问题:使用ajax跳转到新页面无效(浏览器Safari)
  11. Memcached下载安装、NET对Memcached进行CRUD操作(2)
  12. 20154312《网络对抗》Exp2 后门原理与实践
  13. 洛谷P2234 [HNOI2002] 营业额统计 [splay]
  14. Fully Digital Implemented Delta-Sigma Analog to Digital Converter
  15. 设计模式 - 模板方法模式(template method pattern) 具体解释
  16. NUMA架构的优缺点
  17. Codeforces #436 Div2 E
  18. sqlserver创建存储过程返回table
  19. Java for LeetCode 095 Unique Binary Search Trees II
  20. 《网络管理》IP地址管理与子网划分

热门文章

  1. Linux系统下搭建FTP/SFTP服务器
  2. MyBatis思维导图
  3. mybatis学习----------查询数据库返回结果为空
  4. ssh软件及命令的使用
  5. 炸弹人 之 N A B C D
  6. static 继承
  7. C# winForm调用WebService
  8. 【动态规划】POJ-3616
  9. 【图论】POJ-3255 次短路径
  10. SpringMVC中Controller的返回值类型