jzoj 5778 没有硝烟的战争

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41709770/article/details/81515631

题目

这里写图片描述这里写图片描述


题解

–好像有点玄学?这是本蒟蒻做的第一道博弈题耶,没办法,就当是定义记呗
首先对于A,如果B的选择里有必败策略,那A必胜(黑人???)
那就分为相邻两动物是同种还是异种
如果是同种,如果B有必胜策略,A也必胜
如果是异种,如果B有必败策略,A也必胜

然后把换拆成链
用后缀和优化一下
再把从i开始看成是先报一个0就好
答案就是f[i][0]

那就直接dp啦
啦啦啦啦


代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cstring>
using namespace std;
const int MAXN=5005;

int n,m,k;
int a[MAXN];
int f[MAXN][MAXN];
int sum[MAXN][MAXN];

int next(int x){
    if(x==n)
        return 1;
    return x+1;
}

int main(){
    freopen("vode.in","r",stdin);
    freopen("vode.out","w",stdout);
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int j=m-2;j>=0;j--){
        for(int i=1;i<=n;i++){
            int l=j+1,r=min(m-1,j+k);
            if(a[next(i)]!=a[i]&&sum[next(i)][l]-sum[next(i)][r+1]<r-l+1)
                f[i][j]=1;
            if(a[next(i)]==a[i]&&sum[next(i)][l]-sum[next(i)][r+1]>0)
                f[i][j]=1;
            sum[i][j]=sum[i][j+1]+f[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        if(f[i][0])
            printf("%d ",a[i]);
        else
            printf("%d ",1-a[i]);
    }
    return 0;   
}

猜你喜欢

转载自blog.csdn.net/qq_41709770/article/details/81515631