pta 海盗分赃
P 个海盗偷了 D 颗钻石后来到公海分赃,一致同意如下分赃策略:
首先,P 个海盗通过抽签决定 1 - P 的序号。然后由第 1 号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如果能够得到包括 1 号在内的绝对多数(即大于半数)同意,则按照该分配方案执行,否则 1 号将被投入大海喂鲨鱼;而后依次类似地由第 2 号、第 3 号等等海盗提出方案,直到能够获得绝对多数同意的方案出现为止,或者只剩下最后一位海盗,其独占所有钻石。请编写一个程序,给出第 1 号海盗的钻石分配方案中自己分得的钻石数量。
附带的三个假定:
- “聪明”与“贪婪”假定:每个海盗总能够以本人利益最大化作为行为准则;
- “人性化”假定:在能够取得尽量多钻石的情况下,海盗不会故意致同伙于死地;
- “无偏见”假定:海盗之间没有个人恩怨,分给其他海盗钻石的次序以小序号优先为原则。
输入格式
输入在一行中给出 2 个正整数 D 和 P(3≤P≤D≤100)。
输出格式
输出第 1 号海盗的钻石分配方案中自己分得的钻石数量。
题意理解(对三个假定的理解)
- “聪明”与“贪婪”假定,这个好理解,要求使得自己得到的钻石数目最多
- “人性化”假定,没有得到钻石,一定会投反对票;得到了钻石,还要求得到的是相比其他序号分配,得到的最多数量钻石(如果是2号分配给我1个钻石,那么1号最少必须分配2个钻石给我,我才投同意票)
- “无偏见”假定,海盗都遵循上述规则做事。
另外,需要注意,当海盗人数大于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号所得钻石数量) |
---|---|
3 | D-1 |
4 | D-3 |
5 | D-3 |
6 | D-4 |
7 | D-4 |
8 | D-5 |
9 | D-5 |
10 | D-6 |
: | : |
n | D-(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;
}