C++解决海盗分金问题
#include <iostream>
#include <unordered_map>
#include <map> // 假定:每个海盗都是一样的聪明,没有谁比谁笨,都很理智可以 做出理性的决策,那么1号如何决策才能使自己的收益最大且当然不会被扔进大海里喂鲨鱼? // 答案分析: 1号海盗分给3号1枚金币,4号或5号2枚金币,自己则独得97枚金币,即分配方案为(97,0,1,2,0)或(97,0,1,0,2)。 // 现来看如下各人的理性分析: // 5号海盗:因为他是最安全的,没有被扔下大海的风险,因此他的策略也最为简单,即最好前面的人全都死光光,那么他就可以独得这100枚金币了。
// 4号海盗:他的生存机会完全取决于前面还有人存活着,因为如果1号到3号的海盗全都喂了鲨鱼,那么在只剩4号与5号的情况下,不管4号提出怎样的分配方案,5号一定都会投反对票来让4号去喂鲨鱼,以独吞全部的金币。哪怕4号为了保命而讨好5号,提出(0,100)这样的方案让5号独占金币,但是5号还有可能觉得留着4号有危险,而投票反对以让其喂鲨鱼。因此理性的4号是不应该冒这样的风险,把存活的希望寄托在5号的随机选择上的,他惟有支持3号才能绝对保证自身的性命。
// 3号海盗:他经过上述的逻辑推理之后,就会提出(100,0,0)这样的分配方案,因为他知道4号哪怕一无所获,也还是会无条件的支持他而投赞成票的,那么再加上自己的1票就可以使他稳获这100金币了。
// 2号海盗:也经过推理得知了3号的分配方案,那么他就会提出(98,0,1,1)的方案。因为这个方案相对于3号的分配方案,4号和5号至少可以获得1枚金币,理性的4号和5号自然会觉得此方案对他们来说更有利而支持2号,不希望2号出局而由3号来进行分配。这样,2号就可以屁颠屁颠的拿走98枚金币了。
// 1号海盗:经过一番推理之后也洞悉了2号的分配方案。他将采取的策略是放弃2号,而给3号1枚金币,同时给4号或5号2枚金币,即提出(97,0,1,2,0)或(97,0,1,0,2)的分配方案。由于1号的分配方案对于3号与4号或5号来说,相比2号的方案可以获得更多的利益,那么他们将会投票支持1号,再加上1号自身的1票,97枚金币就可轻松落入1号的腰包了。 void assgin(int p, int g)
{
using namespace std;
std::unordered_map<int, int> method_before{{1, 100}, {2, 0}, {3, 0}};
int num = 3; while (++num <= p)
{
int flag = num / 2;
std::multimap<int, int> method_after;
cout << num << endl;
for (auto iter = method_before.begin(); iter != method_before.end(); ++iter)
{
method_after.emplace(iter->second, iter->first);
method_before[iter->first] = 0;
}
method_before.emplace(num, 0);
for (auto iter = method_after.begin(); iter != method_after.end(); ++iter)
{
if (flag == 0)
break;
method_before[iter->second + 1] = iter->first + 1;
--flag;
}
int sum = 0;
for (auto iter = method_before.begin(); iter != method_before.end(); ++iter)
{
sum += iter->second;
}
method_before[1] = g - sum;
for (auto iter = method_before.begin(); iter != method_before.end(); ++iter)
{
cout << iter->first << ":" << iter->second << " ";
}
cout << endl;
} } int main(void)
{
int personNum = 10;
int goldNum = 100;
assgin(personNum, goldNum);
return 0;
}
运行结果
4
4:1 3:1 2:0 1:98
5
5:2 4:0 3:1 2:0 1:97
6
6:0 5:1 4:2 3:1 2:0 1:96
7
7:1 6:2 5:0 4:0 3:1 2:0 1:96
8
8:2 7:0 6:1 5:1 4:0 3:1 2:0 1:95
9
9:0 8:1 7:2 6:0 5:1 4:0 3:1 2:0 1:95
10
10:1 9:2 8:0 7:1 6:0 5:1 4:0 3:1 2:0 1:94
➜ CPP
C++解决海盗分金问题的更多相关文章
- 海盗分金问题SQL求解(贪心算法)
问题 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂鲨 ...
- NYOJ 994 海盗分金 逆向递推
链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=994 题意: 有n个海盗劫得了窖藏的m块金子,并准备瓜分这些战利品.按照古老流传下来的分金法则 ...
- java实现第五届蓝桥杯海盗分金币
海盗分金币 有5个海盗,相约进行一次帆船比赛. 比赛中天气发生突变,他们被冲散了. 恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人. 第一个人在沙滩上发现 ...
- js解决千分符问题
js脚本function: //js数字千分符处理 function commafy(num) { num = num + ""; var re = /(-?\d+)(\d{3}) ...
- js解决千分符问题[收藏下]
//js数字千分符处理 function commafy(num) { num = num + ""; var re = /(-?\d+)(\d{3})/ while (re.te ...
- 采用Sharding-JDBC解决分库分表
源码:Sharding-JDBC(分库分表) 一.Sharding-JDBC介绍 1,介绍 Sharding-JDBC是当当网研发的开源分布式数据库中间件,从 3.0 开始Sharding-JDBC被 ...
- 【MySQL】如何解决分库分表遇到的自增主键的问题?
雪花算法 Redis生成主键
- Google面试题[一]
谷歌是不少IT人都想去的企业,那么在进入公司前,少不了面试笔试的测试.那么这里我们就总结了如下谷歌笔试题,并提供了一些参考答案.希望对您有用. 谷歌笔试题:判断一个自然数是否是某个数的平方.当然不能使 ...
- 博弈论BOSS
基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_c ...
- 【Mark】博弈类题目小结(HDU,POJ,ZOJ)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小 ...
随机推荐
- 蓝桥杯训练赛二-2021 问题 G: 坐标排序
题目描述 请将坐标x,y,z依照以下规则排序: x为第一关键字,当x相同时,依照y(第二关键字)大小来排序,当y相同时,依照z大小来排序(第三关键字) 给出了若干坐标,和一个数k,请输出按关键字排序第 ...
- MySQL 5.7升级8.0过程(详解)
记一次MySQL 5.7升级8.0的详细过程,聊聊我的思路,希望可以帮助大家. 以一个例子为切入点 一.升级背景 为什么要升级到MySQL8.0?大概多久进行一次? 大家可以参考下图记录的各个版本的发 ...
- SCI论文写作技巧-introduction和related works
introduction怎么写 a)背景介绍,现状(介绍别人研究),存在问题,怎样解决,我的做法,有何亮点 b)研究背景和重要性.引出该领域科研空白.点题-指出本文的研究课题.概述文章的核心方法论和主 ...
- mybatis 一级、二级缓存机制
MyBatis 提供了对缓存的支持,分为一级缓存和二级缓存 一级缓存是 SqlSession 级别的缓存.在操作数据库时需要构造 SqlSession 对象,在对象中有一个数据结构(HashMap)用 ...
- Demo of canvas, canvas optimization and svg
It used the canvas to draw the curves in the old project, and the client felt that it was vague, so ...
- 吴恩达老师机器学习课程chapter07——聚类
吴恩达老师机器学习课程chapter07--聚类 本文是非计算机专业新手的自学笔记,高手勿喷. 本文仅作速查备忘之用,对应吴恩达(AndrewNg)老师的机器学期课程第十三章. 缺少重要推演,只能作为 ...
- disp
str = sprintf( 'Best Cross Validation MSE = %g Best c = %g Best g = %g',bestmse,bestc,bestg); disp(s ...
- css代码中的2个类名连一起写是啥意思?
<div class="menu-btn closed"> <div class="menu-line"></div> &l ...
- 冷冻法快速还原Oracle数据库
1.重新装完系统之后,把D:\app\Administrator\oradata拷贝出来,app目录. 2.安装Oracle数据库,创建一个和oradata目录内同名的实例. 3.通过停止服务的方式关 ...
- Promise的几个方法解析
Promise.all 此方法在集合多个 promise 的返回结果时很有用. 输入的promise中只要有一个reject,即进入reject,否则会进入then 完成(Fulfillment):在 ...