欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2018HDU多校3-Problem F. Grab The Tree(hdu 6324)-博弈

程序员文章站 2022-06-09 17:56:26
...

2018HDU多校3-Problem F. Grab The Tree(hdu 6324)-博弈

题意:

Q和T两人玩游戏,Q先手,从一棵树中选择若干个点,并得到这些点的异或和,要求不能同时选取相邻的两点。Q选完后,T取剩余的点,谁取的这些点的异或和大谁获胜,问比赛结果

思路:

看到两人玩游戏,看到先后手,考虑博弈。
分两种情况讨论,Q=T时,则两人所取点的异或和相同,由异或运算法则可得,Q^T=0,即所有点的异或和为0
Q!=T时,因为Q是先手取,T只能选Q剩下的点,所以Q按照某一规则取点,若异或和大,则就这么取,反之,取相反的一组点,所以Q一定能获胜
其他方法:树形dp

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+100;
int t,n,sum = 0;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int temp;
        sum = 0;
        for(int i = 1; i <= n; i++){
            scanf("%d",&temp);
            sum ^= temp;
        }
        int v,u;
        for(int i = 1; i < n; i++){
            scanf("%d%d",&v,&u);
        }
        if(sum == 0) printf("D\n");
        else printf("Q\n");
    }
    return 0;
}