HDU 1538 A Puzzle for Pirates(海盗分金问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1538

题意:有n个海盗,分m块金子,从第n个海盗开始,依次提出自己的分配方案,如果50%以上的人赞成,则方案通过,开始分金子,如果不通过,则把提出方案的扔到海里,下一个人继续。问编号为p的人最多分得多少金子?

思路:以下是cxlove的思路:如果只有两个人的话那么2号开始提出方案,这时候2号知道不管提什么,他自己肯定赞成,过半数,方案通过,那么2号肯定把所有的金子都给了自己。如果只有三个人的话:那么3号知道,如果自己死了,那么2号肯定能把所有金子拿下,对于1号来说没有半点好处。那么他就拿出1个金子贿赂1号,1号拿到1个金子,总比没有好,肯定赞成3号,剩下的金子3号拿下。如果只有四个人的话:那么4号知道,如果自己死了,那么1号拿到1个金子,2号什么都没有,3号拿下剩下的金子。那他就可以拿出1个金子贿赂2号,2号知道如果4号死了,自己将什么都没有,他肯定赞成4号,4号拿下剩下的全部金子。如此类推下去,貌似就是第一个决策的时候,与他奇偶性相同的人会被贿赂拿到1个金子,剩下的全归提出方案的人所有。但是会有一个问题便是,如果金子不够贿赂怎么办?

(1)如果n<=2*m时候,前面与n相同奇偶性的得到1个金子,剩下的第n个人拿下。

(2)如果n==2*m+1,第n个人拿出m个金子贿赂前面的m个人。自己不拿金子,这样刚好保证自己不死;
(3)如果n>2*m+1,我们可以得到,编号为m*2+2^i的人可以不死且拿不到一个金子。假设有500个海盗,只有100个金子,那么前面201个已经分析过了。对于202号来说,自己不能拿金币,而贿赂上一轮没有拿到金币的101人中的100人就够了。对于203号来说,需要102个人的支持,显然加上他自己,还需要101票,而金子不够贿赂,别人会反对,而达到杀人的目的。对于204号来说,他知道一旦自己死了,203号是必死,抓住这点,203必然支持他,因为203号宁可不要金币,也要保住性命,所以204号把100个金币分给之前的100个人,然后203和他自己的两票保证自己不死。对于205号来说,203和204是不会支持他的,因为一旦205死了,他们不仅可以保住性命,而且还可以看着205死掉。所以205是必死。那么206呢,虽然205必死,会支持他,但是还是缺一票,所以必死。对于207呢,205和206之前是必死,会支持他,但是加上自己以及100个贿赂名额,还是必死。对于208号,205,206,207是必死的,肯定会支持208成功,那么208刚好能凑齐104票,得以保命。
 


int n,m,p;

void deal()
{
    int i,temp=n-m-m;
    for(i=0;(1<<i)<=temp;i++) if(temp==(1<<i))
    {
        puts("0");
        return;
    }
    for(i=1;i<20;i++) if(temp<(1<<i))
    {
        if(p>m+m+(1<<(i-1))&&p<m+m+(1<<i))
        {
            puts("Thrown");
        }
        else puts("0");
        return;
    }
}

int C;

int main()
{
    for(scanf("%d",&C);C--;)
    {
        scanf("%d%d%d",&n,&m,&p);
        if(n<=m+m)
        {
            if(n==p) printf("%d\n",m-(n-1)/2);
            else if(n%2==p%2) puts("1");
            else puts("0");
            continue;
        }
        if(n==m+m+1)
        {
            printf("%d\n",(p&1)&&p<n);
            continue;
        }
        deal();
    }
    return 0;
}

  

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值