[BZOJ] 1088: [SCOI2005]扫雷Mine

只有两列,知道第一个是否放雷就可以推出剩下的了,判断合法即可。

复杂度O(n)

#include<iostream>
#include<cstdio>

using namespace std;

inline int rd(){
    int ret=0,f=1;char c;
    while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
    while(isdigit(c))ret=ret*10+c-'0',c=getchar();
    return ret*f;
}

const int MAXN=1000005;

int f[MAXN],a[MAXN];

int n,ans;

int main(){
    n=rd();
    for(int i=1;i<=n;i++){
        a[i]=rd();
    }
    for(f[1]=0;f[1]<=1;f[1]++){
        int flag=1;
        for(int j=2;j<=n;j++){
            f[j]=a[j-1]-f[j-1]-f[j-2];
            if(f[j]<0) flag=0;
        }
        if(f[1]+f[2]!=a[1]) flag=0;
        if(f[n]+f[n-1]!=a[n]) flag=0;
        ans+=flag;
    }
    cout<<ans;
}

 

posted @ 2018-09-05 00:47  GhostCai  阅读(...)  评论(... 编辑 收藏