codeforces C. Game On Leaves

codeforces C. Game On Leaves_第1张图片

题目

题意:

给你一颗树,每一次都可以取一个叶子节点,现在问你谁可以最好取走叶子节点,每次都取最优。

思路:

我们分成两种情况:

  • 第一种就是刚刚开始就可以取到叶子节点的时候,所以刚刚开始的时候,就可以直接去到叶子节点了。
  • 第二种就是让 x x x作为根节点,然后每一次取一个叶子节点,我们可以发现,如果不是叶子节点的情况下,那么必有两个子结点,那么最后的时候肯定会出现剩下三个节点,一个根节点,两个子结点的情况,然后根据谁先拿了一个子结点,那么下一个就是根节点,所以总共需要拿 n − 2 n-2 n2个子结点,答案就是判断 n − 2 n-2 n2的奇偶性。
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
template <class T>
inline void read(T &ret) {
    char c;
    int sgn;
    if (c = getchar(), c == EOF) return ;
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    sgn = (c == '-') ? -1:1;
    ret = (c == '-') ? 0:(c - '0');
    while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
    ret *= sgn;
    return ;
}
int xxxxxxxxx = 1;
inline void outi(int x) {if (x > 9) outi(x / 10);putchar(x % 10 + '0');}
inline void outl(ll x) {if (x > 9) outl(x / 10);putchar(x % 10 + '0');}
inline void debug(ll x) {cout << xxxxxxxxx++ << " " << x << endl;}
inline void debugs(string s) {cout << s << endl;}
const int maxn = 1e3 + 10;
veci edge[maxn];
int main() {
    int t, n, x;
    read(t);
    while (t--) {
        read(n), read(x);
        for (int i = 1; i <= n; i++) edge[i].clear();
        for (int i = 0; i < n - 1; i++) {
            int u, v;
            read(u), read(v);
            edge[u].push_back(v);
            edge[v].push_back(u);
        }
        if (edge[x].size() <= 1) printf("Ayush\n");
        else {
            if ((n - 2) % 2 == 0) printf("Ayush\n");
            else printf("Ashish\n");
        }
    }
    return 0;
}

你可能感兴趣的:(codeforces)