题目: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游戏 (线性基+博弈论)打卡的更多相关文章

  1. 洛谷$P$4301 $[CQOI2013]$新$Nim$游戏 线性基+博弈论

    正解:线性基 解题报告: 传送门! 这题其实就是个博弈论+线性基,,,而且博弈论还是最最基础的那个结论,然后线性基也是最最基础的那个板子$QwQ$ 首先做这题的话需要一点点儿博弈论的小技能,,,这题的 ...

  2. BZOJ.3105.[CQOI2013]新Nim游戏(线性基 贪心 博弈论)

    题目链接 如果后手想要胜利,那么在后手第一次取完石子后 可以使石子数异或和为0.那所有数异或和为0的线性基长啥样呢,不知道.. 往前想,后手可以取走某些石子使得剩下石子异或和为0,那不就是存在异或和为 ...

  3. BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基

    [题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...

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

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

  5. [CQOI2013]新Nim游戏 线性基

    题面 题面 题解 首先我们知道nim游戏先手必败当且仅当所有石堆异或和为0,因此我们的目标就是要使对手拿石堆的时候,无论如何都不能使剩下的石堆异或和为0. 对于一个局面,如果我们可以选取一些可以凑出0 ...

  6. BZOJ 3105: [cqoi2013]新Nim游戏(线性基)

    解题思路 \(nim\)游戏先手必胜的条件是异或和不为\(0\),也就是说第一个人拿走了若干堆后不管第二个人怎么拿都不能将剩余堆的异或和变成\(0\).考虑线性基,其实就是每个数对线性基都有贡献,任何 ...

  7. BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论

    BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作 ...

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

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

  9. [CQOI2013]新Nim游戏(博弈论,线性基)

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

随机推荐

  1. 在python3.7下怎么安装matplotlib与numpy

    一.安装matplotlib 1.在Matplotlib的官网下载电脑对应的版本,网址为:https://pypi.org/project/matplotlib/#files 2.将在下载的.whl文 ...

  2. paper 165: 人脸的两个关键问题--光照和姿态

    人脸识别关键问题研究 a) 人脸识别中的光照问题 光照变化是影响人脸识别性能的最关键因素,对该问题的解决程度关系着人脸识别实用化进程的成败.研究思路是将在对其进行系统分析的基础上,考虑对其进行量化研究 ...

  3. Bugku | Easy_vb

    载入ida,直接搜‘ctf’就有了,坑点是不要交“MCTF{XXX}”,要交“flag{XXXX}”

  4. 重温《javascript高级程序设计》(第3版)

    1.重温<JavaScript高级程序设计>(第3版) (一)重温<javascript高级程序设计>(第1-4章) (二)重温<JavaScript高级程序设计> ...

  5. UVA10271_Chopsticks

    Chopsticks 大致就是有一堆筷子,知道了他们的长度,现在选长度为abc的三个筷子a<=b<=c为一对筷子,质量为(a-b)平方,现在选k双这样的筷子,求质量最小 思路: 第一次看到 ...

  6. idea配置svn正确步骤(下载svn的过程就不写了)

    打开----->File------>Settings 2. 3在vcs中选择 4进入此界面 5选择 这样svn就配置好了

  7. SVD和SVD++

    参考自:http://blog.csdn.net/wjmishuai/article/details/71191945 http://www.cnblogs.com/Xnice/p/4522671.h ...

  8. python序列基本操作

    这里讲一基本概念:容器---可以包含其他对象的对象:两种主要的容器是序列(列表和元祖)和映射(字典) 关于序列的通用基本操作:python中常用的序列主要有两种:列表和元祖  -------索引,切片 ...

  9. 如何使用 C++ Inja html template 模板

    C++ html template Inja是现代C ++的模板引擎,受到jinja for python的启发.它有一个简单而强大的模板语法,包含所有变量,循环,条件,包含,回调,您需要的注释,嵌套 ...

  10. putchar(".:-=+*#%@"[(int)(d * 5.0f)])

    前两天在玩知乎时候见到有个用C语言画心的小代码感觉还是蛮好玩的,不过,里面有行代码看了好久才懂: putchar(".:-=+*#%@"[(int)(d * 5.0f)]); ,先 ...