HDU

来源:互联网 发布:linux卸载光盘命令 编辑:程序博客网 时间:2024/05/22 14:50

题目:有n个海盗,分m块金子,其中他们会按一定的顺序提出自己的分配方案,如果50%以上的人赞成,则方案通过,开始分金子,如果不通过,则把提出方案的扔到海里,下一个人继续。从第n个人开始决策,问第p个人能分多少金子,或是被扔到海里

思路:

参考http://blog.csdn.net/acm_cxlove/article/details/7853916  的博客做出来的,写的很详细

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<algorithm>#include<ctime>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<vector>#include<map>#include<set>#include<queue>#include<stack>#include<list>#include<numeric>using namespace std;#define LL long long#define ULL unsigned long long#define INF 0x3f3f3f3f#define mm(a,b) memset(a,b,sizeof(a))#define PP puts("*********************");template<class T> T f_abs(T a){ return a > 0 ? a : -a; }template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}// 0x3f3f3f3f3f3f3f3f//0x3f3f3f3fint fac[15]={2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};void solve(int n,int m,int p){    if(n<=2*m){//金币够贿赂的情况        if(n!=p&&(n%2==p%2))            printf("1\n");        else if(n==p) printf("%d\n",m-(n-1)/2);        else printf("0\n");        return;    }    if(n==2*m+1){        if(n==p||n%2!=p%2)            printf("0\n");        else            printf("1\n");        return;    }    int t=n-2*m;    for(int i=0;i<14;i++)        if(t==fac[i]){            printf("0\n");            return;        }    for(int i=0;i<14;i++)        if(t<fac[i]){            if(2*m+fac[i-1]<p&&p<2*m+fac[i])                printf("Thrown\n");            else                printf("0\n");            return;        }}int main(){//    freopen("D:\\input.txt","r",stdin);//    freopen("D:\\output.txt","w",stdout);    int T,n,m,p;    scanf("%d",&T);    while(T--){        scanf("%d%d%d",&n,&m,&p);        solve(n,m,p);    }    return 0;}