洛谷 P2327 [SCOI2005] 扫雷

来源:互联网 发布:sql server pdf下载 编辑:程序博客网 时间:2024/06/05 19:58

题目描述
这里写图片描述

输入输出格式
输入格式:

第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)

输出格式:

一个数,即第一列中雷的摆放方案数。

输入输出样例

输入样例#1:
2
1 1

输出样例#1:
2


【分析】
看错了数据范围…评测机也不提示RE,于是我的AC率就被这道题卡没了。
设l[i]表示第i行是否有雷,a[i]表示第i行题目给出的雷数,则有递推式
l[i]=a[i-1]-l[i-1]-l[i-2]。

根据题意可发现最多只有两种可能,即l[1]的值分别为0和1,于是把l[1]先后赋值为0和1进行递推,若在递推过程中发现l[i]不为0或1则这种情况不合法。

注意最后要判断a[n]是否等于l[n]+l[n-1],否则会被hank一个点。


【代码】

//P2327 [SCOI2005] 扫雷#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;int a[10005],l[10005],n;inline bool ditui(int x){    int i,j;    l[1]=x;    fo(i,2,n)    {        l[i]=a[i-1]-l[i-1]-l[i-2];        if(l[i]<0 || l[i]>1) return 0;    }    if(l[n]+l[n-1]!=a[n]) return 0;    return 1;}int main(){    int cnt=0,i,j;    scanf("%d",&n);    fo(i,1,n)      scanf("%d",&a[i]);    if(ditui(0)) cnt++;    if(ditui(1)) cnt++;    printf("%d\n",cnt);    return 0;}
1 0
原创粉丝点击