欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-07 21:20:50
...

【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;
}

相关标签: PTA 团队天梯赛