
【问题描述】
万里长城是中国强大的标志,长城在古代的用途主要用于快速传递军事消息和抵御
外敌,在长城上的烽火台即可以作为藏兵的堡垒有可以来点燃狼烟传递消息。 现在有一段
万里长城,一共有 N 个烽火台,有些烽火台里驻扎有士兵,而有一些烽火台没有驻扎。一
次将军巡视时发现了一个巨大的防卫漏洞,一个烽火台狼烟点燃后,并不是任意一个烽火
台就能看见,当距离超过 D 后就不能看见了,为了保证第一个烽火台的狼烟点燃后能顺利
传递到第 N 个烽火台,将军必须要在一些没有驻扎士兵的烽火台中安排士兵驻扎。
长城中一共有 N 个烽火台,第 1 个烽火台和第 n 个烽火台中一定驻扎着士兵,每
个烽火台直接距离是 1,将军必须安排士兵到一些烽火台使得第 1 个烽火台的狼烟能顺利
传递到第 n 个烽火台,不过由于长城太长了,将军没有太多的士兵来安排,所以他求助于
你,希望你计算出 安排士兵最少的烽火台数量。
【输入格式】
第一行是 2 个整数 N,D,表示一共 N 个烽火台,狼烟能传递的最长距离 D
接下来一行是 N 个数 0 或 1,表示第 i 个烽火台是否驻扎士兵,1 表示驻扎了士兵,0 表示
没有驻扎。数据保证第 1 个和第 N 个一定是 1
【输出格式】
1 个整数表示安排士兵的最少烽火台数量
【输入样例 1】
4 1
1 0 1 1
【输出样例 1】
1
【输入样例 2】
8 2
1 1 0 0 1 0 0 1
【输出样例 2】
2
【数据规模】
20%数据 N<=20
50%数据 N<=1000
100%数据,N<=300000 ,1<=D<=N
签到题。
据说有搜索和dp拿部分分的做法(蒟蒻表示不会)。
显然模拟更好写啊?
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,d;
int main(){
freopen("wall.in","r",stdin);
freopen("wall.out","w",stdout);
n=read(),d=read();
int cnt=0,ans=0;
for(int i=1;i<=n;++i){cnt=(read()?0:cnt+1);if(cnt==d)cnt=0,++ans;}
cout<<ans;
return 0;
}