摘要:
题目意思是这样的,给定一个数N,第一个可以减去任意一个数(不能为N本身),然后接下来轮流减去一个数字,下一个人减去的数字必须大于0,且不大于2倍上一次被减去的数字。把N减为0的人获胜。看完题目后不会做,果断就上午找题解了。原来如此啊。。。。 首先我们可以打个表(在30的范围以内),就可以发现必败态是N为斐波那契数。也就是说如果给定的数字不是一个斐波那契额数,那么就是必胜的。接下来的问题是如何找到一个第一次减小的最小的数字呢?可以递归找,每次都找最近的,知道恰好等于一个斐波那契数为止。 1 #include 2 #include 3 #include 4 #define inf (unsi... 阅读全文
摘要:
题目的意思就不说了,典型的取石子的博弈问题。题目的前半部分就是赤果果的SG函数值异或就可以了,其中Sg函数值就是石子数本身。但是接下来有个小变换,就是要你输出先手必胜有多少种不同的取法。首先要想保持必胜,必须要取完以后保证所有的石子数异或值为0.这样,假设我们来判断某一堆是否可取的时候,我们可以用总的异或值来与当前堆石子数异或一下,就得出当前堆应该剩下多少石子哦(仔细理解这里就好了)下面可以贴代码了: 1 #include 2 #include 3 using namespace std; 4 5 int a[1005],n,m,ans; 6 7 int main() 8 { 9 ... 阅读全文
摘要:
这是一个比较经典的博弈题目,今年网赛好像是南京赛上有一个类似的题目。这种题目是没有一定公式或者函数的,需要自己dp或者搜索解决。题意为分别给你4张写有1,2,3,4,5,6的卡片共24张,每次轮流拿一张卡片,且所有被拿过的卡片的总和不能超过31,谁无法拿出卡片就fail。首先对于每种卡片一共可能有5中存在情况,所以六张卡片一共有5^6种情况,同时我们保存当前拿到的卡片的数量的和,然后记忆化搜就行了。记得每次取最优,同时还要注意除掉拿过的牌,当前是谁第一个拿牌哦。 1 #include 2 #include 3 #include 4 #define maxn 20000 5 using n... 阅读全文