bzoj 1299: [LLH邀请赛]巧克力棒(nim游戏的应用)

1299: [LLH邀请赛]巧克力棒

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 420  Solved: 231

[Submit][Status][Discuss]

Description

TBL和X用巧克力棒玩游戏。每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度。TBL先手两人轮流,无法操作的人输。 他们以最佳策略一共进行了10轮(每次一盒)。你能预测胜负吗?

Input

输入数据共20行。 第2i-1行一个正整数Ni,表示第i轮巧克力棒的数目。 第2i行Ni个正整数Li,j,表示第i轮巧克力棒的长度。

Output

输出数据共10行。 每行输出“YES”或“NO”,表示TBL是否会赢。如果胜则输出"NO",否则输出"YES"

Sample Input

3

11 10 15

5

13 6 7 15 3

2

15 12

3

9 7 4

2

15 12

4

15 12 11 15

3

2 14 15

3

3 16 6

4

1 4 10 3

5

8 7 7 5 12

Sample Output

YES

NO

YES

YES

YES

NO

YES

YES

YES

NO

HINT

20%的分数,N<=5,L<=100。

40%的分数,N<=7。 50%的分数,L<=5,000。

100%的分数,N<=14,L<=1,000,000,000。

Source

[Submit][Status][Discuss]

题解:博弈问题。需要用到NIM游戏,NIM游戏就是有N堆石子,每次可以从一堆石子中选取任意个石子,最后无法取的人失败。对于NIM游戏有一个简单的结论: a[1]^a[2]^a[3]..^a[n]=0则此时先手必败,反正先手必胜。

那么这道题其实就可以看成一个NIM游戏。我们发现如果先手能从石子中选取m堆,使他的异或和为0,是剩下n-m堆无论怎么选取异或和都不为0,即将异或和为0的最大序列选取出来,那么选出来的M堆就相当于新建了一个NIM游戏,而如果后手从这堆中进行游戏的话就相当于先手,那么后手必败。如果后手也新建nim游戏,再选出来x堆的话,因为选出来的异或和一定不为0,那么整个游戏的先手就又面对了必胜态,只需将这个nim游戏转成必败态,留给后手即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,a[100];
bool p;
void dfs(int x,int num,int ans)
{
	if (x==n+1)
	 {
	 	if (!ans&&num) p=true;
	 	return;
	 }
	dfs(x+1,num,ans); if (p) return;
	dfs(x+1,num+1,ans^a[x]);
	if (p) return;
}
int main()
{
	for (int t=1;t<=10;t++)
	 {
	 	scanf("%d",&n);
	 	for (int i=1;i<=n;i++)
	 	 scanf("%d",&a[i]);
	 	p=false;
	 	dfs(1,0,0);
	 	if (p) printf("NO\n");
	 	else printf("YES\n");
	 }
}
时间: 2024-10-28 08:19:24

bzoj 1299: [LLH邀请赛]巧克力棒(nim游戏的应用)的相关文章

BZOJ 1299 [LLH邀请赛]巧克力棒 博弈(NIM游戏)+构造

题意:链接 方法:博弈+构造 解析: 神题没想到咋做,看完wyf大爷说的话才懂 这道题的题意就是有n堆石子,之后你每次操作有两种做法 第一种是在已经建立的nim游戏上进行nim游戏. 第二种是在未被选的堆中选取若干堆加入这个nim游戏中. 所以这怎么做? 我一直尝试去建立一个必败态,不过可能我走的方法过多的考虑了将这道题转变为nim游戏套nim游戏而最终走入死胡同,不会做了. 然而这道题的必败态可以这么建:如果是先手的话,我可以建立出来一个异或和为0的nim游戏,此时后者有两种做法,第一种是在该

BZOJ1299: [LLH邀请赛]巧克力棒(Nim游戏)

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 552  Solved: 331[Submit][Status][Discuss] Description TBL和X用巧克力棒玩游戏.每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度.TBL先手两人轮流,无法操作的人输. 他们以最佳策略一共进行了10轮(每次一盒).你能预测胜负吗? Input 输入数据共20行. 第2i-1行一个正整数Ni,表示第i轮巧克力棒的数目.

bzoj:1299: [LLH邀请赛]巧克力棒

原题:http://www.lydsy.com/JudgeOnline/problem.php?id=1299 众多dalao的题解已经很详细了:http://blog.csdn.net/wzq_qwq/article/details/47258871 这里我只补充一下用高斯消元的方法优化到14*14*30的时间复杂度,而不是2^14 目标是求出是否有一种取数方案使异或和为0 那么按位拆分一下,得到30个方程,但是只有14个变量.解是肯定存在的(全部不取),但是我们希望解的数量大于一.由于解的数

【BZOJ】1299: [LLH邀请赛]巧克力棒

[算法]博弈论 [题解]这道题不是典型的SG函数题了. 不把它当成游戏看待,那么这道题是在说n个石子堆,每次可以加入若干个或进行Nim游戏. 我们当前先手,则考虑构造必败态来获胜. 当前已加入的NIm游戏SG=0,则必须考虑加入石子堆,若加入m堆构造出SG=0,对方有两种选择: 加入新的石子堆,则必须是SG=0. 进行Nim游戏,但是目前SG=0,先手必败. 所以只要把n堆中异或和=0的最长子序列在第一次操作时移入即可先手必胜. #include<cstdio> #include<alg

BZOJ 3105:[cqoi2013]新Nim游戏

BZOJ 3105:[cqoi2013]新Nim游戏 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题目大意:在传统的Nim取石子游戏中做了改变:两人刚开始可以取走任意堆石子(不包括全部)后进行传统游戏,问先手能否必胜,若必胜求出刚开始最少取多少石子. 线性基 传统Nim游戏先手必胜的前提条件为$a_0 \lxor a_1 \lxor a_2 \lxor ... \lxor a_{n-1} \neq 0$. 故若欲使新Nim游

BZOJ1299 [LLH邀请赛]巧克力棒

怎么又是博弈论...我去 Orz hzwer,这道题其实是可以转化成Nim游戏的! "第一步: 先从n根巧克力棒中取出m(m>0)根,使得这m根巧克力棒的xor和为0,同时使得剩下的n-m根巧克力棒无论怎么取,xor和都不为0. m根巧克力棒的xor和为0 <=>把nim游戏的必败状态留给对方 剩下的n-m根巧克力棒无论怎么取,xor和都不为0 <=>  m为巧克力棒的xor和为0的最长子序列 第二步: 第一步以后,对手就面临一个必败状态的nim游戏. 如果他从n-

【bzoj1299】[LLH邀请赛]巧克力棒(博弈论思维题)

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1299 首先我们把每根巧克力棒看成一堆石子,把巧克力棒的长度看作石子的个数,那么原问题就可以看成一个经典的nim问题(取石子问题)的变种,它和原问题的区别在于每堆石子需要经过一步操作解封后才能从里面取出石子. 这道博弈题的思维方式和普通题不太一样,不能通过简单的构造sg函数的方法解决.但是我们可以注意到它和普通的nim游戏的一些相同之处:即同样是从几堆石子中从某一堆拿若干个石子出来.即

【bzoj1299】[LLH邀请赛]巧克力棒 博弈+模拟

Description TBL和X用巧克力棒玩游戏.每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度.TBL先手两人轮流,无法操作的人输. 他们以最佳策略一共进行了10轮(每次一盒).你能预测胜负吗? Input 输入数据共20行. 第2i-1行一个正整数Ni,表示第i轮巧克力棒的数目. 第2i行Ni个正整数Li,j,表示第i轮巧克力棒的长度. Output 输出数据共10行. 每行输出“YES”或“NO”,表示TBL是否会赢.如果胜则输出”NO”,否则输出”YES

B1299 [LLH邀请赛]巧克力棒 博弈论

这个题一看就是nim游戏的变形.每次先手取出巧克力就是新建一个nim,但假如先手取一个为0的而且无论后手怎么取剩下的都无法为零就行了.然后用dfs跑. 题干: Description TBL和X用巧克力棒玩游戏.每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度.TBL先手两人轮流,无法操作的人输. 他们以最佳策略一共进行了10轮(每次一盒).你能预测胜负吗? Input 输入数据共20行. 第2i-1行一个正整数Ni,表示第i轮巧克力棒的数目. 第2i行Ni个正整数