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

复杂度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;
}

 

相关文章:

  • 2021-09-09
  • 2021-09-03
  • 2021-11-17
  • 2021-08-25
  • 2021-10-11
  • 2021-10-17
猜你喜欢
  • 2021-11-13
  • 2022-12-23
  • 2022-12-23
  • 2021-09-03
  • 2021-09-08
  • 2021-07-03
相关资源
相似解决方案