本文共 1369 字,大约阅读时间需要 4 分钟。
题意: 给你一颗有n个节点的无根树,现在每次可以删除一个以叶子节点为端点的所有边并删除这个节点,现在指定一个节点x,谁先删到这个节点,谁就获胜(Ayush 先手 Ashish后手)。思路:
如果指定的节点本来是叶子节点,那么Ayush第一次就能直接拿到它,赢得比赛。这种情况下,Ayush肯定会赢。如果Ayush不能一举拿到,那么每个人都会尽量避免让指定节点的度降到1。也就是说,指定的节点一旦度为2,其他人就不会再主动删除与它相连的边,除非对方已经没有其他选择了。这让我想到这是一场拿数的博弈,谁先拿到只剩最后两个节点时谁就赢了。如果初始节点数n是偶数,Ayush一开始就能掌控节奏,最后让Ashish陷入孤立无援;反之,如果n是奇数,情况就有所不同,Ashish可能有机会反败为胜。AC代码:
```cpp #includeint read() { char c = getchar(); int x = 0, s = 1; while (c < '0' || c > '9') { if (c == '-') s = -1; c = getchar(); } while (c >= '0' && c <= '9') { x = x * 10 + (c - '0'); c = getchar(); } return x * s; }
#define NewNode (TreeNode *)malloc(sizeof(TreeNode)) #define Mem(a, b) memset(a, b, sizeof(a))
const int N = 1e5 + 5; const long long INFINF = 0x7f7f7f7f7f7f7f; const int INF = 0x3f3f3f3f; const double EPS = 1e-7; const unsigned long long mod = 998244353; const double II = acos(-1); const double PP = II * 1.0 / 180.0;
typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> pii; typedef pair<ll, ll> piil;
int main() { std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; while (t--) { int n, x; cin >> n >> x; int ru[1050] = {0}; for (int i = 0; i < n-1; ++i) { cin >> a >> b; ru[a]++, ru[b]++; } if (ru[x] <= 1) { cout << "Ayush\n"; } else if (n % 2 == 0) { cout << "Ayush\n"; } else { cout << "Ashish\n"; } } }
转载地址:http://ynirz.baihongyu.com/