BZOJ 1982 Moving Pebbles】的更多相关文章

首先我们假设只有两堆, 容易发现当且仅当两堆相等时,先手必败 否则先手必胜 然后我们猜测一下原因: ->当两堆相等时,无论先手怎么做,后手总能使两堆相等,且必败态为0,0 推广一下: 当所有的石子堆可以两两配对且配对的两两相等时,先手必败 否则先手必胜 证明一下: 1.当出现两两可以配对且相等的情况时,由两堆相等的情况可以推论,无论先手怎么做,后手总能使局面回到两两配对且相等的情况 2.如果不是两两可以配对且相等的情况时,先手总能使局面变成两两配对且相等 #include<cstdio>…
1982: [Spoj 2021]Moving Pebbles Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 130  Solved: 88[Submit][Status][Discuss] Description 2021. Moving Pebbles Two players play the following game. At the beginning of the game they start with n (1<=n<=10000…
题目 Moving Pebbles Two players play the following game. At the beginning of the game they start with n (1<=n<=100000) piles of stones. At each step of the game, the player chooses a pile and remove at least one stone from this pile and move zero or m…
[SPOJ2021] Moving Pebbles 题目大意:给你\(N\)堆\(Stone\),两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头,然后移动任意个石子到任意堆中. 谁不能移动了,谁就输了 Solution n为偶数,这些石子堆都是可以两两配对的石子堆,后手必胜,那么无论如何先手对它移动,后手都可以对另一个配对的石子堆做相应的调整. n为偶数,但是石子不可以两两配对,先手必胜,可以令最高堆与最低堆相同,然后将其他堆的石子数补成两两相同. \(n\)为奇数,先手必胜,因为先手一定可…
E&D 染色游戏 Moving Pebbles E&D 题目大意 给出 \(2n\) 堆石子,\(2i-1\) 和 \(2i\) 为一组.每次可以选择一组删掉其中一堆,然后从同一组另外一堆选出若干石子放入被删掉的堆内,需要保证每个时刻每堆石子大小 \(\ge 1\).不能操作的人就算输.问先手是否有必胜策略. \(n\le 10^4\) 思路 首先我们发现我们肯定是对一组找出 sg 值,然后异或起来,于是问题就是如何求出 \(sg(x,y)\),然后我们打表之后发现: 然后你通过 oies…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1982 [题目大意] 两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头, 然后移动任意个石子到任意堆中. 谁不能移动了,谁就输了 [题解] 首先如果对于奇数堆,那么先手必胜,因为可以构建必败态 对于偶数的情况,如果是石子堆两两相同的对称局面,则为必败态,反之必胜 [代码] #include <cstdio> #include <algorithm> #include &…
这道题在论文里看到过,直接放论文原文吧 在BZOJ上是单组数据,而且数据范围符合,直接int读入排序就行了.代码: #include <cstdio> #include <algorithm> using namespace std; const int MAXN = 100005; int n, a[MAXN]; int main () { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf(&q…
给你N堆Stone,两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头,然后移动任意个石子到任意堆中. 谁不能移动了,谁就输了... 以前在poj做过已经忘记了... 构造对称,选最多的一堆往其他堆分构造对称局面,先手必胜 一开始就对称,先手必败 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using…
必败状态是n为偶数并且数量相同的石子堆可以两两配对,因为这样后手可以模仿先手操作 其他状态一定可以由先手给后手一步拼出一个必败状态(用最大堆补) #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=100005; int n,a[N],ok=1; int read() { int r=0,f=1; char p=getchar(); while(…
这道题的题意BZ和POJ上的都不大清楚... 大概就是给出n堆石子,以及初始每堆石子的个数 两个玩家交替操作,每个操作可以任意在一堆中取任意多的石子 然后再从这堆里拿若干个石子放到某个当前还存在的堆里,当然这个操作也可以不做 问先手还是后手有必胜策略 博弈的题目果然是脑洞大啊... 最后的结论: 对于奇数堆,先手必胜 偶数堆时,先手败当且仅当所有的堆都可以分成两两相等的堆 证明大概就是: 首先考虑1堆的情况,先手显然胜 考虑两堆且相等的情况,如果先手拿完,后手把剩下一堆拿完:如果先手没拿完 后手…