hdu5996 hdu5724 - 阶梯博弈

学习文章连接:https://blog.csdn.net/kk303/article/details/6692506

hdu5724

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5724

代码如下:(不太懂)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<set>
#include<string>
#include<cstring>
#define ll long long
using namespace std;
const int N=1003;
int cnt[25];

int main(){
    int t,a,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int ans=0,m;
        for(int i=1;i<=n;i++){
            memset(cnt,0,sizeof(cnt));
            scanf("%d",&m);
            for(int i=1;i<=m;i++){
                scanf("%d",&a);
                cnt[a]++;
            }
            int tot=0,j=20,fg=0;
            while(cnt[j])j--;
            for(;j;j--){
                if(!cnt[j])ans^=(fg?tot:0),fg^=1,tot=0;
                else tot++;
            }
            ans^=(fg?tot:0);
        }
        if(ans)printf("YES\n");
        else printf("NO\n");
    }
}

hdu5996

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5996

刚开始还写了个dfs……超时,后来想想我们把深度为奇数的点异或不久行了吗,而点的深度等于父节点的深度加1

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<set>
#include<string>
#include<cstring>
#define ll long long
using namespace std;
const int N=100005;
int dep[N],a[N];

int main(){
    int b,t,n;
    scanf("%d",&t);
    while(t--){
        memset(dep,0,sizeof(dep));
        scanf("%d",&n);
        for(int i=1;i<n;i++){
            scanf("%d",&b);
            dep[i]=dep[b]+1;
        }
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        int ans=0;
        for(int i=1;i<n;i++){
            if(dep[i]%2)ans^=a[i];
        }
        if(ans)printf("win\n");
        else printf("lose\n");
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/82786613