【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;
}
上一篇: 初识HEROKU