Gameia HDU - 6105 多校6

一开始题目看见input里farther,完全没理解,后来看见admin说其实是father,但题目里也没修改,坑。。
还有就是切掉一条边,对节点无影响,只是bob无法将颜色染过去;
然后bob也只能涂空的节点,然后将直接用边连接的节点全变为黑的(一开始以为能涂在白色上)
比赛时莫名wa。。找不到原因,结束后看了数据结果我判断的是k 与 n / 2 的大小,实际上是k 与 n / 2 - 1 的大小。无语;

思路
1首先A如果选择端点附近的点,那么B必须染端点,所以能控制两个两个一起变黑,使vip功能失效,所以n如果是奇数,A必赢;

2如果n是偶数,A也可以通过选择端点,那b必须选择端点直接连接的点,且b必须使用功能;不然个数变成奇数,走上面那条;所以要比较k 与 n / 2 - 1 大小,判断功能次数是否足够

3如果次数足够,就要考虑 出现某个结点有>=2个子节点为叶子节点。A染这个点,B跟不上A的节奏,出现孤点,Ailice取胜;

我打的代码太繁琐了,所以贴一个简单又好理解的
http://blog.csdn.net/qq_37412229/article/details/77093330

#include <bits/stdc++.h>
using namespace std;
const int maxn=1000;
int n, k, father[maxn], size[maxn];
int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        bool flag = true;
        cin >> n >> k;
        for(int i = 2; i <= n; ++ i)
            cin >> father[i];
        for(int i = 1; i <= n; ++ i)
            size[i] = 1;
        for(int i = n; i >= 1; -- i)
        {
            if(size[i] >= 3)
                flag = false;
            size[father[i]] += size[i] & 1;
        }
        if(flag && n % 2 == 0 && k >= n / 2 - 1)
            cout << "Bob" << endl;
        else
            cout << "Alice" << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值