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