这道题目确实很难,特判的情况很多,参考了大神的题解才AC掉 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove

题目:这是一个经典问题,有n个海盗,分m块金子,其中他们会按一定的顺序提出自己的分配方案,如果50%以上的人赞成,则方案通过,开始分金子,如果不通过,则把提出方案的扔到海里,下一个人继续。

首先我们讲一下海盗分金决策的三个标准:保命,拿更多的金子,杀人,优先级是递减的。

同时分为两个状态稳定状态和不稳定状态:如果当n和m的组合使得最先决策的人(编号为n)不会被丢下海, 即游戏会立即结束, 就称这个状态时"稳定的". 反之, 问题会退化为n-1和m的组合, 直到达到一个稳定状态, 所以乘这种状态为"不稳定的".

接下来我们从简单的开始分析:

如果只有两个人的话:那么2号开始提出方案,这时候知道不管提什么,他自己肯定赞成,过半数,方案通过,那么2号肯定把所有的金子都给了自己。

如果只有三个人的话:那么3号知道,如果自己死了,那么2号肯定能把所有金子拿下,对于1号来说没有半点好处。

那么他就拿出金子贿赂1号,1号拿到1个金子,总比没有好,肯定赞成3号,剩下的3号拿下。

如果只有四个人的话:那么4号知道,如果自己死了,那么1号拿到1个金子,2号什么都没有,3号拿下剩下的金子。

那他就可以拿出部分金子贿赂2号,2号知道如果4号死了,自己将什么都没有,他肯定赞成4号。

如此类推下去,貌似就是第一个决策的时候,与他奇偶性相同的人会被贿赂拿到1个金子,剩下的全归提出方案的人所有。

但是会有一个问题便是,如果金子不够贿赂怎么办。

情况1、我们首先归纳之前的,如果n<=2*m时候,前面与n相同奇偶性的得到1个金子,剩下的第n个人拿下。

情况2、如果n==2*m+1,第n个人拿出m个金子贿赂前面的m个人。自己不拿金子,这样刚好保证自己不死,这就是之前提到的优先级,首先得保命,如果自己拿了一个金子,那么前面就有一个人会反对,因为对于那个人,不管怎么样都分不到金子,则轮到第三个原则,杀人,肯定投反对票。

剩下来我们考虑,钱不够贿赂的情况:

我们将问题具体化:如果有500个海盗,只有100个金子,那么前面201个已经分析过了。

对于202号来说,自己不能拿金币,而贿赂上一轮没有拿到金币的101人中的100人就够了。

对于203号来说,需要102个人的支持,显然加上他自己,还需要101票,而金子不够贿赂,别人会反对,而达到杀人的目的。

对于204号来说,他知道一旦自己死了,203号是必死,抓住这点,203必然支持他,因为203号宁可不要金币,也要保住性命,所以204号把100个金币分给之前的100个人,然后203和他自己的两票保证自己不死。

对于205号来说,203,和204是不会支持他的,因为一旦205死了,他们不仅可以保住性命,而且还可以看着205死掉。所以205是必死

那么206呢,虽然205必死,会支持他,但是还是缺一票,所以必死。

对于207呢,205和206之前是必死,会支持他,但是加上自己以及100个贿赂名额,还是必死

对于208号,205,206.,207因为后面是必死的,肯定会支持208成功,那么208刚好能凑齐104票,得以保命。

以下我们猜想:n=2*m+2^k的情况下,是可以保命的,称为稳定状态,否则为不稳定状态,我们证明一下:

首先对于n来说,有m票贿赂,但是对于2*m+2^(k-1)以前必死的死,他们会支持2*m+2^(k-1),因为他们肯定拿不到钱,而且支持2*m+2^(k-1),另外根据杀人原则,希望之后的人都死,轮到2*m+2^(k-1)决策的时候保命就行了。

同理2*m+2^(k-1)到2*m+2^k之间的2^(k-1)-1个人来说,他们必死,所以必定支持2*m+2^k,加上m个金币贿赂的,加上他自己,刚好有m+2^(k-1)。这样刚好凑齐一半,可以不死。

证明完毕:2*m+2^k的人可以保命,否则必死。

我们考虑一下分金币情况:

情况3:对于第2*m+2^k个人来说,他可以保命,肯定分不到金子,而他手上的m个金子,可以贿赂m个人,但是具体是哪些人是不定的。则不管是不能分到金子,还是可能分不到金子的人来说,结果都为0。

情况4:对于2*m+2^(k-1)到2*m+2^k之间的来说,他们的决策是必死,而在他们决策的时候,其它人分得金币情况也为0。

我们来解释一下金币的不确定性:

金币数量的不确定性:由上面的推理可知, 当n=2m+2时, 上一轮推理没有分到金币的人的金币数量首次具有不确定性, 并且在n>2m+2时, 这种不确定性一定会延续下去, 轮到因为n号决策者之前的一个人决策时, 那个人肯定分不到金币了, 所以在上一轮推理中没有分到金币的人的个数一定大于m.

综合情况1,2,3,4便是本题的解

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define M 1000000
int num[15]={2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
int main()
{std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);ll t,n,m,p;cin>>t;while(t--){cin>>n>>m>>p;if(n<=m*2){if(n==p)cout<<m-(n-1)/2<<endl;else if(n%2==p%2)cout<<1<<endl;elsecout<<0<<endl;}else if(n==2*m+1){if(n==p)cout<<0<<endl;else if(n%2==p%2)cout<<1<<endl;elsecout<<0<<endl;}else{int temp=n-2*m;for(int i=0;i<=14;i++ ){if(temp==num[i]){cout<<0<<endl;break;}}for(int i=1;i<14;i++){if(temp<num[i]){if(p>2*m+num[i-1]&&p<2*m+num[i])cout<<"Thrown"<<endl;elsecout<<"0"<<endl;break;}}}}return 0;
}

hdu_oj1538A Puzzle for Pirates(海盗分金)相关推荐

  1. HDU 1538 A Puzzle for Pirates(经典的海盗分金推理)

    题目: 这是一个经典问题,有n个海盗,分m块金子,其中他们会按一定的顺序提出自己的分配方案,如果50%以上的人赞成,则方案通过,开始分金子,如果不通过,则把提出方案的扔到海里,下一个人继续. 首先我们 ...

  2. 大象起舞:用PostgreSQL解海盗分金问题

    作者简介 张泽鹏(redraiment):51信用卡信贷业务高级架构师. 资深挖坑不填党:在51先后挖过风控.信审.数据支持等多个互金信贷相关的坑 冷技术控:51内 PostgreSQL.FreeBS ...

  3. IBM面试题:海盗分金算法及其思想

    IBM面试题: 妈妈有2000元,要分给她的2个孩子.由哥哥先提出分钱的方式,如果弟弟同意,那么就这么分.但如果弟弟不同意,妈妈会没收1000元,由弟弟提出剩下 1000元的分钱方式,这时如果哥哥同意 ...

  4. 海盗分金-动态规划实现

    经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才被通过,否则他将被扔入大海喂鲨 ...

  5. 有趣的海盗分金问题(博弈论)

    海盗分金问题 关于海盗分金问题是经济学上的一个经典模型:是说5个海盗抢得100金币,他们按照抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才能被通过,否则他将被扔入 ...

  6. 【逻辑推理系列】海盗分金模型分析

    海盗分金模型逻辑分析 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他 ...

  7. 博弈论之海盗分金(最严谨)

    为什么要强调严谨版呢?因为大多数地方都最终有两个结果,但其实,如果严格来说,只有一个答案. 博弈论又被称为对策论,是现代数学的一个重要分支,在经济学.金融学.计算机科学.政治学.军事战略学等方面有着重 ...

  8. 由“三姬分金”到“海盗分金”

    "秦时明月--天行九歌篇"中有这么一章:"三姬分金". http://www.tudou.com/albumplay/QxZOIU2BloQ/B4u0I7Vxm ...

  9. 博弈论 —— 海盗分金

    1. 博弈论基本概念 局中人同时做决策的博弈,叫"静态博弈". 如果决策有先后,后面的人,可以根据前面人的决策,决定和调整自己的决策,就叫"动态博弈". 先决策 ...

最新文章

  1. vue中点击导航栏部分,页面切换
  2. JAVA Static方法与单例模式的理解
  3. 第十课.简单文本分类
  4. 转:不是技术牛人,如何拿到国内IT巨头的Offer
  5. 【Linux】文件特殊权限 SUID/SGID/Sticky Bit
  6. 广域网应用场景包括哪些?—Vecloud
  7. Java编码手册之华山版小精华
  8. 12699元的iPhone 11 Pro Max物料成本却不足3500元,苹果赚疯了?
  9. ws配置 zuul_微服务网关 Spring Cloud Gateway
  10. Windows创建新账户进行登录
  11. 快回家了,感觉什么事情都不想做,除了吃饭睡觉
  12. 软件开发人员的简历项目经验
  13. 谷粒学院(十六)OAuth2 | 微信扫码登录 | QQ扫码登录
  14. 用python输入三角形边长_python实现输入三角形边长自动作图求面积案例
  15. 世界儿童日,周大福真诚关爱儿童成长
  16. 23考研计算机:天津理工大学
  17. Linux初窥:CentOS配置本地yum源与网络yum源
  18. 红米手机如何刷linux系统版本,红米手机的手机系统是什么?红米手机能升级安卓4.2吗?...
  19. ax²+bx+c≡0 mod m 和 x²≡a mod p的解存在性分析
  20. uni-app开发微信小程序,关于获取手机号事件绑定的坑

热门文章

  1. SPFA算法求最短路
  2. 关于嵌入式是前端还是后端
  3. AAA认证流程,AAA认证怎么办理
  4. Elasticsearch:将数据从 Elasticsearch 和 Kibana 导出到 Pandas Dataframe
  5. python计算quantile
  6. Python环境pycharm配置anaconda过程
  7. Wwise 空间音频方案
  8. keil C51使用printf函数
  9. JavaScript类型转换整理
  10. 【LDA】为什么 w^T Σ w 代表类内散度?