bzoj 1088: [SCOI2005]扫雷Mine

链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1088

思路; 很明显当第一列的第一个和第二个格子的值确定时,后面每个格子的值都是可以确定的。当第二列第一个格子为0或2时,我们都可以确定第一列前两个格子,当第二列第一个格子为1时,会有两种可能,一开始想到这里因为前两个格子确定了后面都是可以确定的值就直接判如果a[1]==2||a[1]==0直接输出1,a[1]==1输出2,但是wa了。。因为虽然之后的格子值是确定的,但是确定的方案未必是对的,我们需要判断下当前方案是否成立

 

实现代码:

#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 10;
int f[M],a[M],n;
int solve(){
     for(int i = 2;i < n;i ++){
        if(a[i] < f[i]+f[i-1]) return 0;
        f[i+1] = a[i] - f[i] - f[i-1];
     }
     if(f[n]+f[n-1] != a[n]) return 0;
     return 1;
}

int main()
{
    int x,ans;
    cin>>n;
    for(int i = 1;i <= n;i ++)  cin>>a[i];
    if(a[1] == 0){
        f[1] = 0; f[2] = 0; ans = solve();
    }
    else if(a[1] == 1){
        f[1] = 0; f[2] = 1; ans = solve();
        f[1] = 1; f[2] = 0; ans += solve();
    }
    else {
        f[1] = 1; f[2] = 1; ans = solve();
    }
    cout<<ans<<endl;
}

 

posted @ 2019-03-21 21:10  冥想选手  阅读(132)  评论(0编辑  收藏  举报