【PTA团队天梯赛】L2 7-98 海盗分赃 (25分)

在这里插入图片描述
这个题我刚开始做的时候感觉虽然题目描述不多,但是我却一直没有get到题目的意思。后来看了一下网上的题解,感觉这个题真的是太巧妙了!所以记录一下。

思路:
首先我们要理解这三个原则。每个海盗都想尽可能获得最多的钻石,但是前提是要活着,比如说你拿走了全部钻石,那别人肯定不同意就会把你杀死。所以你分配钻石的情况下还要争取得到一半的人的投票。
其次,如果有两个海盗的时候你能拿到两个钻石,而现在多了一个海盗你只能获得1个钻石那么你肯定不同意。所以这道题要从海盗的人数从少到多来迭代。
那么我们来分析一下各个人数的情况来找一下规律:(假设现在有10个钻石)
当只有两个海盗的时候:
你作为一号应该分配: 0 10
因为如果你不全部给二号,它把你杀死也能获得十个

当只有三个海盗的时候:
你作为一号应该分配:9 1 0
因为多了一个人,你多了谈判的筹码,如果二号不同意这么分配,那么把你杀死之后下一次只剩二号三号来分配,2号只能拿到0颗,所以二号一定会支持你。此时你已经获得了两票的支持,所以符合。

当只有四个海盗的时候:
你作为一号应该分配:7 0 2 1
此时如果你被杀死,轮到二号分配的时候三号只能拿到一颗,四号只能拿到0颗,所以三号四号都会支持你,所以符合

同样的道理当只有五个海盗的时候:
你作为一号应该分配:7 0 1 0 2

当只有六个海盗的时候:
你作为一号应该分配:6 0 1 2 1 0

当只有七个海盗的时候:
你作为一号应该分配:6 0 1 2 0 0 1

最后,根据上述规律,我们可以发现当只有三个海盗的时候,你能获得D-1个钻石,当P>3的时候,你能获得D-(P/2+1)个钻石;

好,根据上面这个规律,直接上代码:
希望看这篇文章的读者能够好好理解这个策略,刷题的目的不在于会写出这道题代码,而在于能够通过这道题获得能够写出这类题的能力。

#include<stdio.h>
int main()
{
    int D,P;
    scanf("%d%d",&D,&P);
    if(P==3) printf("%d",D-1);
    else printf("%d",D-(P/2+1));
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给个选择

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值