bzoj 1088

设b数组表示这个位置有没有雷。

a[i]=b[i-1]+b[i]+b[i+1]。

b[3]=a[2]-b[2]-b[1]。

b[2]=a[1]-b[1]。

也就是说,只要知道b[1]就可以知道b[2]...b[n]的值。

于是直接枚举b[1]的值把b数组一个个推出来判断是否符合即可。

#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
const int maxn=10001;
int read(){
    char c; while(!isdigit(c=getchar())); int x=c-'0';
    while(isdigit(c=getchar())) x=x*10+c-'0'; return x;
}
int a[maxn],b[maxn];
int main(){
    int n=read(),ans=0;
    for(int i=1;i<=n;i+=1) a[i]=read();
    for(int i=0;i<=1;i+=1){
        b[1]=i; ans+=1;
        for(int j=2;j<=n;j+=1){
            b[j]=a[j-1]-b[j-1]-b[j-2];
            if(b[j]>1 || b[j]<0){ans--; goto next;}
        }
        if(b[n-1]+b[n]!=a[n]) ans--;
        next:;
    }
    printf("%d",ans);
    return 0;
}

 

posted @ 2017-10-24 10:55  或是七一  阅读(...)  评论(... 编辑 收藏