bzoj1982 [Spoj 2021]Moving Pebbles 博弈论

开始还以为要用sg函数。

想了半天想不出来。

后来才发现想错了。

/**************/

显而易见,当n为偶数并且a[i]可以两两配对时,状态为先手必败。

因为无论你做什么操作对方都可以做另外一个操作来抵消你的操作。

其他情况是先手必胜。你总能通过一步变为先手必败的状态。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline int read(){
    int x=0,f=1,ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘){f=-1;}ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int n;
int a[100005];
int main(){
    n=read();int i;
    if(n&1){
        puts("first player");
        return 0;
    }
    for(i=1;i<=n;i++) a[i]=read();
    sort(a+1,a+1+n);
    for(i=1;i<=n;i+=2)
        if(a[i]!=a[i+1]){
            puts("first player");
            return 0;
        }
    puts("second player");
    return 0;
}

  

时间: 2024-07-31 14:35:18

bzoj1982 [Spoj 2021]Moving Pebbles 博弈论的相关文章

BZOJ 1982: [Spoj 2021]Moving Pebbles [博弈论 对称]

给你N堆Stone,两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头,然后移动任意个石子到任意堆中. 谁不能移动了,谁就输了... 以前在poj做过已经忘记了... 构造对称,选最多的一堆往其他堆分构造对称局面,先手必胜 一开始就对称,先手必败 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using

BZOJ 1982 Spoj 2021 Moving Pebbles 博弈论

题目大意:给定n堆石子,每次可以选择一堆石子,拿走任意个,然后将堆中剩余石子移动任意个到任意一些堆里,不能操作者为输,求是否先手必胜 必败状态为:n为偶数,且将石子数相同的堆两两配对可以配成n2对 例如: 6 1 1 4 4 5 5 这就是一个先手必败的初始状态 证明: 首先证明这个状态是必败的 由于堆可以两两配对,因此无论先手做什么,后手都可以对另一个堆做同样的事情,故先手必败 对于一种其他状态,先手可以用一步将状态变为必败状态,故其他状态下先手必胜 如果初始有奇数堆石子,那么先手可以将最小的

[BZOJ1982][POJ1740][Spoj 2021]Moving Pebbles|解题报告

这道题的题意BZ和POJ上的都不大清楚... 大概就是给出n堆石子,以及初始每堆石子的个数 两个玩家交替操作,每个操作可以任意在一堆中取任意多的石子 然后再从这堆里拿若干个石子放到某个当前还存在的堆里,当然这个操作也可以不做 问先手还是后手有必胜策略 博弈的题目果然是脑洞大啊... 最后的结论: 对于奇数堆,先手必胜 偶数堆时,先手败当且仅当所有的堆都可以分成两两相等的堆 证明大概就是: 首先考虑1堆的情况,先手显然胜 考虑两堆且相等的情况,如果先手拿完,后手把剩下一堆拿完:如果先手没拿完 后手

BZOJ 1982 [Spoj 2021]Moving Pebbles(博弈论)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1982 [题目大意] 两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头, 然后移动任意个石子到任意堆中. 谁不能移动了,谁就输了 [题解] 首先如果对于奇数堆,那么先手必胜,因为可以构建必败态 对于偶数的情况,如果是石子堆两两相同的对称局面,则为必败态,反之必胜 [代码] #include <cstdio> #include <algorithm> #include &

[SPOJ2021] Moving Pebbles

[SPOJ2021] Moving Pebbles 题目大意:给你\(N\)堆\(Stone\),两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头,然后移动任意个石子到任意堆中. 谁不能移动了,谁就输了 Solution n为偶数,这些石子堆都是可以两两配对的石子堆,后手必胜,那么无论如何先手对它移动,后手都可以对另一个配对的石子堆做相应的调整. n为偶数,但是石子不可以两两配对,先手必胜,可以令最高堆与最低堆相同,然后将其他堆的石子数补成两两相同. \(n\)为奇数,先手必胜,因为先手一定可

博弈论题表(好少~~~)

bzoj2017:[Usaco2009 Nov]硬币游戏 *用了一小点思想的傻逼dp(记忆化搜索)bzoj1188:[HNOI2007]分裂游戏 **很神奇的把游戏拆分为子游戏的方法bzoj1022:[SHOI2008]小约翰的游戏John *傻逼SJ定理题bzoj1982:[Spoj 2021]Moving Pebbles **思路不一般的并不是很难证的傻逼结论题bzoj2688:Green Hackenbush **切树模型的傻逼概率dp(外有特殊的飞行技巧-判0剪枝)bzoj2281:[S

博弈论入门小结

感受到了被博弈论支配的恐惧-- 入门的话个人按顺序推荐几篇论文: <由感性认识到理性认识--透析一类搏弈游戏的解答过程>张一飞 <解析一类组合游戏>  王晓珂 <组合游戏概述-浅谈SG游戏的若干拓展及变形> 贾志豪 看完这三篇还是要有点时间的,然而博主很傻的倒着看完了,然后就成功地完成了入门到放弃,事倍功半-- 到现在为止博弈论做了7道题,感觉只是大致学了一点皮毛,以后肯定回去再做一些题目,然而Hz书店没有和博弈论有关的书,差评. 只能说博弈论是一个很奇妙的东西,并没有

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

SPOJ Problem:A Game with Numbers

突然就看到SPOJ升级了,让我好不适应.. 这一一道博弈论的题目,可以先前面暴力一下,易得小于十的为必胜态,十的时候必败,然后11到19又必胜,而且发现只要各位为零且这个数不为零就必败. 再依次验证上百,上千的数.. #include<cstdio> #include<cstring> int n; int main(){ scanf("%d",&n); if (n%10==0&&n!=0)printf("2\n");