cdoj 1253 阿里巴巴和n个大盗 博弈论

阿里巴巴和n个大盗

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/problem/show/1253

Description

阿里巴巴和n个大盗来到了一个藏满宝石的洞穴。洞里一共有m颗价值连城的宝石,每一颗都等价。盗亦有道,为了奖励帮忙打开洞穴门的阿里巴巴,大盗们决定让他一起加入分赃。大盗们决定采用一种方式分赃,分赃的方式如下:

1)每个人由抽签决定了自己的号码(1, 2, 3, ?, n+1)。

2)由n+1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时(包括他自己),按照他的方案进行分配,否则这个人将被杀死。

3)n+1号死后,由n号接替n+1号对剩下的人提出分配方案,类似2步骤。以此类推。

大盗们都有如下的几个性格特点

1)足智多谋,总是采取最优策略。

2)贪生怕死,尽量保全自己性命。

3)贪得无厌,希望自己得到越多宝石越好

4)心狠手辣,在自己利益最大的情况想希望越多人死越好。

5)疑心多虑,不信任彼此,尽量确保自身利益不寄希望与别人给自己更大利益。

不知道是不幸还是幸运,阿里巴巴抽到了n+1号签,意味着他将第一个提出分配方案。他想请教机智的你,他能否活下来,如果能又将获得最多多少个宝石?

Input

两个整数n, m,分别表示n个大盗和m个宝石(1≤n≤2⋅m−2, 2≤m≤100)。

Output

如果阿里巴巴能活下来输出一个整数x表示阿里巴巴最多获得的宝石数,否则输出−1。

Sample Input

4 100

Sample Output

97

HINT

题意

题解:

首先总人数是n+1人。
由于必须半数以上人同意才能通过方案,所以当剩余两个人时2号必死,因为1号不同意就能独吞。因此2号必须同意3号的方案,所以3号无论什么方案都会被通过,因此他会选择把所有宝石留给自己。
当总人数三个以上时就有以下的情况:显然4号需要至少3人的同意,可知3号是无论如何不会同意的,因此他只需要拉拢1,2号即可,也就是给他们1,1的宝石。
5个人时只要3个人同意即可,此时因为5号如果死3号必定不会得到宝石,所以只要给他1个宝石即可。然后再拉拢1,2号中的任意一个,给他们2个宝石即可。
以此类推,发现当(n+1)是偶数时阿里巴巴只要给1到n号人1,1,0,1,0,1,0....即可;当(n+1)是奇数时只要给x,x,1,x,1,x,1....(任意一个x是2,其余x都是0)即可。上述两种情况答案都是m-(n+1)/2。
因为题目所给数据范围的限制,本题不会出现m不够用的情况,在这里不再讨论。

注意心狠手辣一词。

代码:

#include <iostream>
#include <cstdio>

using namespace std;

int n,m,ans;

int main()
{
    scanf("%d%d",&n,&m);
    n++;
    if(n>3)
    {
        ans=m-(n+1)/2;
    }
    else
    {
        if(n==2) ans=-1;
        if(n==3) ans=m;
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-08 12:26:43

cdoj 1253 阿里巴巴和n个大盗 博弈论的相关文章

hdu 1536 S-Nim 博弈论,,求出SG&#39;函数就可以解决

S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4975    Accepted Submission(s): 2141 Problem Description Arthur and his sister Caroll have been playing a game called Nim for some time now

CDOJ 1273 God Qing&#39;s circuital law

暴力枚举+idea.做的时候mod写错了,写成了1000000009,找了两个多小时才发现...... a[1],a[2],a[3]....a[N] b[1],b[2],b[3]....b[N] 首先需要枚举b[1]...b[N]与a[1]进行组合. 然后对a[2]...a[N]从小到大排序 对b[1],b[2],b[3]....b[N] 除当前与a[1]组合的以外,剩下的从大到小排序 然后找出每一个a[i]在不破坏a[0]最大值的情况下最大能与哪一个b[i]配对. 然后从第N个人开始往第2个人

UVA 10561 Treblecross(博弈论)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32209 [思路] 博弈论. 根据X分布划分禁区,每个可以放置的块为单独一个游戏.按长度定义状态,构造sg函数.依次试验每一种放法. [代码] 1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #include<algorithm> 5 using names

博弈论的学习之始

今天看了耶鲁大学关于<博弈论>的公开课视频.于是想记录下关于博弈论的学习经历.最近赶上期末,事情超多,唉!不定期观看并记录吧! 视频中没有给出博弈论的具体定义,就不记录了吧!英文名Game Theory. 教授推荐课程书籍:杜塔 <策略与博弈>(课程基础书籍).乔治·沃森<策略>(教授说偏难!).<战略思想>(没看到具体谁的,教授说用来催眠不错!) 第一节课主要讲了博弈的几个原则. 1.不要选严格劣势策略: 2.理性选择造成次优选择: 3.要会换位思考: 4

hdu1856 Brave Game(博弈论)

应该是最基础的那种博弈论的题 (m+1)+多余 == n 如果没有多余,那么就后手赢了 #include<cstdio> int main() { int n; scanf("%d",&n); while(n--){ int x,p; scanf("%d%d",&x,&p); if(x%(p+1)==0 ) printf("second\n"); else printf("first\n")

Part.4【博弈论】

---恢复内容开始--- 不要问我为什么突然跳到Part.4,我懒得解释. 在蔡大神的论文+讲解和HZW的题库下,自己大概是明白什么是博弈论的皮毛了吧. 先说SG定理吧. 对于游戏中的状态,我们给每个状态定义一个必胜态和必败态.区别在于前者可以通过一次操作到达必败态,但后者无法做到(后者在一次操作后所能到达的状态全部都为必胜态) 接着引进SG函数,每个状态都有一个SG值,这个值由它所能到达的状态的SG值决定.(这里的所能到达的状态指的是经过一次操作能到达的状态,下同) SG值有以下性质: SG值

HDU 1253 (简单三维广搜) 胜利大逃亡

奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 9 struct Poin

HDU 1253 胜利大逃亡(BFS)

#include <iostream> #include <cstdlib> #include <cstdio> #include <queue> #include <cstring> using namespace std; struct node{ int x,y,z,step; }; int ma[51][51][51]; int A,B,C,T; int mv[6][3] = {{1,0,0},{0,1,0},{0,0,1},{-1,0,

HDU 1253 胜利大逃亡 NYOJ 523【BFS】

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24608    Accepted Submission(s): 9427 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的