AcWing 229. 新NIM游戏 (线性基+博弈论)打卡
题目:https://www.acwing.com/problem/content/description/231/
题意:给出n堆石子,然后第一回合,A玩家可以随便拿多少堆石子,第二回合B玩家随便拿多少堆石子,第三回合开始就按照NIM博弈来进行,问第一个玩家是否可以获胜,获胜第一回合可以拿最少的火柴数是多少
思路:首先我们清楚的知道NIM博弈,获胜条件是 所有石子异或起来不能为0,也就是说第二个玩家只要能找到当前某堆石子能被其他堆石子表示出来,然后把其他不是的全部拿走就好了,所以我们第一个玩家
必须只能保留基底,其他的都不能留,这样第二个玩家就不能找到被其他表示,因为这是一个极大不相关组,要求拿走的火柴最少,也就是我们用来建基底的要更多,就从大到小排序,
1,这里回答一个疑问,为什么我们一定要把除去基底之外的所有拿走,不能留下一个,然后把能表示出他的基底拿走呢,因为我们基底是按位运算保存的.能表示出当前数,也就是说明存在这个数的二进制位异或出来的,但是这是由若干数异或出来的,可能因为要表示的数没有这个二进制位.但是他异或了两次这个位才取消掉,所以这样的做法拿的火柴数必定比直接拿走的多
#include<bits/stdc++.h>
#define maxn 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll a[maxn],ins[maxn];
ll k,sum;
int cmp(ll x,ll y){
return x>y;
}
void gauss(){
for(int i=;i<=k;i++){
ll x=a[i];
for(int j=;j>=;j--){
if((a[i]>>j)&){
if(!ins[j]){
ins[j]=a[i];
sum-=x;
break;
}
else{
a[i]^=ins[j];
}
}
}
}
printf("%lld",sum);
}
int main(){
scanf("%lld",&k);
for(int i=;i<=k;i++){
scanf("%lld",&a[i]);
sum+=a[i];
}
sort(a+,a+k+,cmp);
gauss();
}
AcWing 229. 新NIM游戏 (线性基+博弈论)打卡的更多相关文章
- 洛谷$P$4301 $[CQOI2013]$新$Nim$游戏 线性基+博弈论
正解:线性基 解题报告: 传送门! 这题其实就是个博弈论+线性基,,,而且博弈论还是最最基础的那个结论,然后线性基也是最最基础的那个板子$QwQ$ 首先做这题的话需要一点点儿博弈论的小技能,,,这题的 ...
- BZOJ.3105.[CQOI2013]新Nim游戏(线性基 贪心 博弈论)
题目链接 如果后手想要胜利,那么在后手第一次取完石子后 可以使石子数异或和为0.那所有数异或和为0的线性基长啥样呢,不知道.. 往前想,后手可以取走某些石子使得剩下石子异或和为0,那不就是存在异或和为 ...
- BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基
[题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...
- BZOJ3105:[CQOI2013]新Nim游戏(线性基,贪心)
Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴 ...
- [CQOI2013]新Nim游戏 线性基
题面 题面 题解 首先我们知道nim游戏先手必败当且仅当所有石堆异或和为0,因此我们的目标就是要使对手拿石堆的时候,无论如何都不能使剩下的石堆异或和为0. 对于一个局面,如果我们可以选取一些可以凑出0 ...
- BZOJ 3105: [cqoi2013]新Nim游戏(线性基)
解题思路 \(nim\)游戏先手必胜的条件是异或和不为\(0\),也就是说第一个人拿走了若干堆后不管第二个人怎么拿都不能将剩余堆的异或和变成\(0\).考虑线性基,其实就是每个数对线性基都有贡献,任何 ...
- BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论
BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作 ...
- BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基
一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...
- [CQOI2013]新Nim游戏(博弈论,线性基)
[CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根 ...
随机推荐
- JS中数据结构之列表
列表是一组有序的数据.每个列表中的数据项称为元素.在 JavaScript 中,列表中的元素可以是任意数据类型.列表中可以保存多少元素并没有事先限定并可以不断壮大,实际使用时元素的数量受到程序内存的限 ...
- 【Java】java获取json中某个字段
import com.alibaba.fastjson.JSONObject; public class JsonTest { public static void main(String[] arg ...
- python类与对象练习题扑克牌
#定义一个扑克类,属性是颜色,数字.#定义一个手类,属性是扑克牌得颜色数字#定义一个人类,属性是左手,右手.类里定义一些方法,比如交换,展示 class Poker : def __init__(se ...
- Nginx反向代理维基百科镜像制作全解析
近日做的Ngnx代理测试,基于Nginx的ngx_http_substitutions_filter_module模块,并利用UA跳转实现PC/移动端不同站点跳转. 1. 关于Nginx的代理详细请转 ...
- SetWindowsHookEx 其他进程的 记录
SetWindowsHookEx( WH_GETMESSAGE,CallWndProc, HInstance, h2); WH_GETMESSAGE 这个类型 hook 其他窗体的 线程是正常的 ...
- urllib爬取实例
#汉字转码.多个参数拼接 from urllib import request base_url = "http://www.baidu.com/s?" content = inp ...
- Java迭代器模式
迭代器模式是Java和.Net编程环境中非常常用的设计模式.此模式用于以顺序方式访问集合对象的元素,而不需要知道其底层表示. 迭代器模式属于行为模式类别. 实现实例 在这个实例中,将创建一个Itera ...
- 【设计模式】FactoryPattern工厂模式
Factory Pattern 简单工厂模式 将变化的部分封装起来 //简单工厂 class SimpleProductFactory{ Product createProduct(String ty ...
- 解决本地工具无法连接服务器上的mysql的问题
当本地工具尝试连接服务器的时候,如果出现无法连接的情况,可能是权限没有开. 首先: mysql> show databases: 发现有mysql数据库 进入该数据库,找到user表 mysq ...
- 深入理解__proto__ 、constructor和prototype的关系
深入理解__proto__ .constructor和prototype的关系 2013-11-12 09:56 1390人阅读 评论(3) 收藏 举报 分类: 前端之Javascript(59) ...