pta 海盗分赃(题意详解)c++实现

pta 海盗分赃

P 个海盗偷了 D 颗钻石后来到公海分赃,一致同意如下分赃策略:

首先,P 个海盗通过抽签决定 1 - P 的序号。然后由第 1 号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如果能够得到包括 1 号在内的绝对多数(即大于半数)同意,则按照该分配方案执行,否则 1 号将被投入大海喂鲨鱼;而后依次类似地由第 2 号、第 3 号等等海盗提出方案,直到能够获得绝对多数同意的方案出现为止,或者只剩下最后一位海盗,其独占所有钻石。请编写一个程序,给出第 1 号海盗的钻石分配方案中自己分得的钻石数量。

附带的三个假定:

  1. “聪明”与“贪婪”假定:每个海盗总能够以本人利益最大化作为行为准则;
  2. “人性化”假定:在能够取得尽量多钻石的情况下,海盗不会故意致同伙于死地;
  3. “无偏见”假定:海盗之间没有个人恩怨,分给其他海盗钻石的次序以小序号优先为原则。

输入格式

输入在一行中给出 2 个正整数 D 和 P(3≤P≤D≤100)。

输出格式

输出第 1 号海盗的钻石分配方案中自己分得的钻石数量。

题意理解(对三个假定的理解)

  1. “聪明”与“贪婪”假定,这个好理解,要求使得自己得到的钻石数目最多
  2. “人性化”假定,没有得到钻石,一定会投反对票;得到了钻石,还要求得到的是相比其他序号分配,得到的最多数量钻石(如果是2号分配给我1个钻石,那么1号最少必须分配2个钻石给我,我才投同意票)
  3. “无偏见”假定,海盗都遵循上述规则做事。
    另外,需要注意,当海盗人数大于3时, 海盗数为3时,2号不会投反对票,因为一旦2号,投反对票,使得1号淘汰,那么变为2人分配情况,“当只有两个海盗时,2号必然会把1号淘汰,自己得到所有钻石,此时自己获益最大”,也即,3号一人得到所有钻石 2号一定会给1号投反对票,要求利益最大化,那么只有把1号淘汰掉,就能轮到自己分配,此时利益必然最大化。

分析(逐次分析,得出规律)

解题核心思想是,得到一半以上同意票,实现利益最大化!!!

题意要求,海盗数目大于等于3,不难理解,当只有两个海盗时,2号必然会把1号淘汰,自己得到所有钻石,此时自己获益最大。

一、3个海盗
讨论,如果2号投反对票,则得到0个钻石,3号得到所有钻石;因此只要给2号1个钻石,2号获益最大,一定会投同意票,此时加上自己的一票已经得到半数同意票,因此3号0个钻石即可。1号最终所得钻石数为,D-1

二、4个海盗
经上述分析,2号必然投反对票,要获得半数以上同意票,则一定要让3号、4号都投同意票。对于3号,如果他投反对票,则1号被淘汰,情况变为3个海盗,3号最终会得到1个钻石,4号0个钻石;所以要使得3号获益最多投出同意票,则需给多余其投反对票时的1个钻石,即最少2个钻石。再对4号分析,如果投出反对票,则1号被淘汰,情况变为3个海盗,3号最终会得到1个钻石,而4号0个钻石;因此要使得4号获益最多,投出同意票,最少给4号1个钻石。综上,1号最终所得钻石数为,D-3

三、5个海盗
同样的,经上述分析,2号必然投反对票,要获得半数以上同意票且1号获益最多,则一定要花最少的钻石让3号、4号、5号中的任意两位投同意票;考虑1号如果淘汰,情况变为4个海盗,(1号淘汰,在4个海盗情况中,分析的结果,对应1号为此时2号,2号为3号,3号为4号,4号为5号)对应的获得钻石数目,3号0个,4号2个,5号1个;显然让3号、5号投同意票,花费的钻石数最少,最少给3号1个,5号2个。综上,1号最终所得钻石数为,D-3

四、6个海盗
2号必然投反对票,要获得半数以上同意票,即除自己外要3票,且1号获益最多;那么要让3号、4号、5号、6号中的任意3位投同意票;分析1号淘汰,情况为5个海盗时他们的钻石数目:3号0个,4号1个,5号0个,6号2个;显然让3号、5号、6号投同意票花费最少,最少给3号1个,4号2个,5号1个。综上,1号最终所得钻石数为,D-4

总结

P(海盗总数目)D1(1号所得钻石数量)
3D-1
4D-3
5D-3
6D-4
7D-4
8D-5
9D-5
10D-6
nD-(P/2+1)

代码——c++实现

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int d,p,r;
    cin>>d>>p;
    if(p==3){r=d-1;}
    else{r=d-(p/2+1);}
    cout<<r;
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值