HDU 4753

#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <list>
#include <cmath>
#include <fstream>
#include <string>

using namespace std;
typedef long long ll;
const int MAXN = 30;
const int inf = 0x3f3f3f3f;
int nm;
int p[MAXN], mk[MAXN];
int sg[1<<12];

int fid(int a, int b) {
    if (a + 1 == b) {
        if (a <= 3)
            return a - 1;
        else if (a <= 7)
            return a - 2;
        else if (a <= 11)
            return a - 3;
        else return a - 4;
    } else 
        return a + 11;
}
int how(int a, int b) {
    int id = fid(a, b);
    mk[id] = 1;
    int num = 0;
    if (a + 1 == b) {
        if (id - 3 >= 0) {
            if (mk[id - 3] && mk[id + 8 + id / 3] && mk[id + 9 + id / 3])
                num ++;
        }
        if (id + 3 < 12) {
            if (mk[id + 3] && mk[id + 12 + id / 3] && mk[id + 13 + id / 3])
                num ++;
        }
    } else {
        if (id % 4) {
            if (mk[id - 1] && mk[id - 10 - id / 4] && mk[id - 7 - id / 4])
                num ++;
        }
        if (id % 4 != 3) {
            if (mk[id + 1] && mk[id - 9 - id / 4] && mk[id - 6 - id / 4])
                num ++;
        }
    }
    return num;
}

int ok(int id, int state) {
    return state & 1<<id;
}
int how2(int id, int flag, int state) {
    int num = 0;
    if (!flag) {
        if (id - 3 >= 0) {
            if (ok(id - 3, state) && ok(id + 8 + id / 3, state) && ok(id + 9 + id / 3, state))
                num ++;
        } 
        if (id + 3 < 12) {
            if (ok(id + 3, state) && ok(id + 12 + id / 3, state) && ok(id + 13 + id / 3, state))
                num ++;
        }
    } else {
        if (id % 4) {
            if (ok(id - 1, state) && ok(id - 10 - id / 4, state) && ok(id - 7 - id / 4, state))
                num ++;
        }
        if (id % 4 != 3) {
            if (ok(id + 1, state) && ok(id - 9 - id / 4, state) && ok(id - 6 - id / 4, state))
                num ++;
        }
    }
    return num;
}

int gao(int s, int t, int s2) {
    int &ans = sg[s], num;
    if (ans != -1) return ans;
    if (s == (1<<nm) - 1) 
        return ans = 0;
    for (int i = 0; i < nm; ++i) {
        if (1<<i & s) continue;
        int y = p[i];
        if (y < 12)
            num = how2(y, 0, s2);
        else
            num = how2(y, 1, s2);

        ans = max(ans, t - gao(s | 1<<i, t - num, s2 | 1<<y));
    }
    return ans;
}

void solve(int cs) {
    memset(sg, -1, sizeof(sg));
    memset(mk, 0, sizeof(mk));
    int n, num, num2, ans;
    num = num2 = nm = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        int a, b;
        scanf("%d%d", &a, &b);
        if (a > b) swap(a, b);
        int tt = how(a, b);
        if (i % 2 == 0) 
            num += tt;
        num2 += tt;
    }
    int s2 = 0;
    for (int i = 0; i < 24; ++i) {
        if (!mk[i]) p[nm ++] = i;
        else s2 |= 1<<i;
    }

    printf("Case #%d: ", cs);
    int now = gao(0, 9 - num2, s2);
    if (n & 1) ans = num + (9 - num2 - now);
    else ans = num + now;
    if (ans >= 5) printf("Tom200\n");
    else printf("Jerry404\n");
}
int main() {
    int T;
    scanf("%d", &T);
    for (int cs = 1; cs <= T; ++cs)
        solve(cs);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值