海盗分赃(pta)

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

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

附带的三个假定:

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

输入格式:

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

输出格式:

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

输入样例:

10 7

输出样例:

6

思路:如果只有两个人的话,那么一号海盗肯定一个都拿不到,因为他仅仅是拿一个给二号海盗d-1个,第二个海盗就会出于贪婪不同意然后一号被喂鲨鱼二号拿全部。

如果是三个人,二号如果不同意一号那么只剩二号和三号的话二号就如同第一种情况的一号,一个都拿不到,而如果一号全拿走一个也不给二号的话二号同意了也和不同意一样一个也拿不到,所以只需要拿一个钻石给二号,二号想着总比一个都拿不到强所以就会同意,所以情况是(9.1.0)。

当是四个人的时候,要再经过两个人的同意才能拿到,假如一号被喂鲨鱼了,那就是三个人的情况,如果我们想不被喂鲨鱼且得到钻石最多,我们只需要挑两个最少的人的金币让他保证比三个人时拿到的钻石数多一个就行了,当三个人的时候是(9.1.0),1.0得到的最少,把他俩钻石数加一,把剩下的人的金币9变成0(因为他不同意,而我们已经找到了两个同意的了),即(0.2.1),那么自己就拿的最多为7且让两个人同意,即(7.0.2.1)

当是五个人的情况的时候,要再经过两个人的同意,那么找最少的两个即0.1让他俩各加一就是1.2,把剩下的人的金币变成0(反正他们不同意),然后情况就是(7.0.1.0.2)

当是六个人的时候我们就要再经过三个人的同意,找最少的三个剩下人的变为0即(6.1.2.1.0)

以此类推,我们就发现当大于三个人的时候获得的金币就是d-p/2-1(需要一半+1的人数同意)

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;


int main(){
	int p,d;
	cin>>d>>p;
	if(p==1)printf("%d",d);
	else if(p==2)printf("0");
	else if(p==3)printf("%d",d-1);
	else {
		printf("%d",d-p/2-1);
	}
	return 0;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值