题目链接: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个人拿下。
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;
}