http://acm.hdu.edu.cn/showproblem.php?pid=1538

经典经济学问题,海盗分金

分析http://www.guokr.com/article/41423/

#include <iostream>
#include <cstdio>

using namespace std;

int a[15];

int main() {
    a[0] = 2;
    for(int i = 1; ; i++) {
        a[i] = a[i-1] * 2;
        if(a[i] * 2 > 10000) break;
    }
    int T;
    scanf("%d", &T);
    int n, m, p;
    while(T--) {
        scanf("%d%d%d", &n, &m, &p);
        int flag;
        if(n <= 2*m) {
            if(p == n) {
                printf("%d\n", m-(n-1)/2);
            }
            else {
                flag = n & 1;
                if((p & 1) == flag) puts("1");
                else puts("0");
            }
        }
        else if(n == 2*m+1) {
            if(p < 2*m && (p & 1)) puts("1");
            else puts("0");
        }
        else {
            flag = 0;
            for(int i = 0; i < 13; i++) {
                if(a[i] == n-2*m) {
                    puts("0");
                    flag = 1;
                }
            }
            if(flag) continue;
            flag = 0;
            if(p > 2 * m) {
                for(int i = 1; i < 13; i++) {
                    if(a[i]+2*m > n)
                    if(p-2*m > a[i-1] && p-2*m < a[i]) {
                        flag = 1;
                        puts("Thrown");
                    }
                }    
                if(!flag) puts("0");
            }
            else {
                puts("0");
            }
        }
    }
    return 0;
}
View Code