Gameia HDU

来源:互联网 发布:尔雅网络课程明史十讲 编辑:程序博客网 时间:2024/05/29 19:58

一开始题目看见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;}
原创粉丝点击