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 首先当然要献上一些非常好的学习资料: 基础博弈的小 ...
随机推荐
- ubuntu22.04LTS下编译glfw
环境准备 # 预装cmake sudo apt install cmake # 下载源码 git clone https://github.com/glfw/glfw.git 编译 # cmake初始 ...
- ES相关问题
取消写入保护 参考:https://blog.csdn.net/xudailong_blog/article/details/80850159
- R7-7 调查电视节目受欢迎程度
R7-7 调查电视节目受欢迎程度 分数 15 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 某电视台要调查观众对该台8个栏目(设相应栏目编号为1~8)的受欢迎情况,共调查了n位观众(1≤n≤ ...
- awk引用外部变量
test]# cat tmp.tmp120.4987 12.717858119.801948 13.38588119.424529 14.024871119.337438 15.070484119.2 ...
- 修改文件时mmap如何处理
拷贝二进制(elf)文件 在拷贝二进制文件的时候,如果文件是一个可执行文件,并且有一个进程在运行这个可执行文件,那么拷贝的时候会出现"文本忙"(ETXTBSY)的错误提示,并且拷贝 ...
- C#windows 服务 《转载》
转自:https://blog.csdn.net/Code_May/article/details/123909870 c#应用Windows服务 背景 一.创建windows服务 1.创建windo ...
- 08 安装虚拟机:Windows 10
08 安装虚拟机:Windows 10 在安装虚拟机之前,总是要有安装来源媒体(例如:ISO映像之类),方可顺利进行.在Proxmox VE中有几种将ISO档置入Proxmox VE的方式,本节介绍其 ...
- HTTP请求报文(请求行,请求头,请求体)
HTTP协议 1.简介 HTTP协议(Hyper Text Transfer Protocol,超文本传输协议),是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...
- RN 手势响应系统基本用法和获取坐标判断用户手势方向
1. 基本使用,注意两点 (1)将手势系统的函数放在"componentWillMount"生命周期函数里面,当时会有警告,警告自己看吧 (2)将方法使用ES6扩展运算符展开 im ...
- C语言II一作业02
1.作业头 | 这个作业属于哪个课程 | < https://edu.cnblogs.com/campus/zswxy/SE2020-3> | | ---- | ---- | ---- | ...