http://www.elijahqi.win/archives/3217
题目描述
The long road through Farmer John’s farm has
N
N crosswalks across it, conveniently numbered
1 \ldots N
1…N (
1 \leq N \leq 100,000
1≤N≤100,000 ). To allow cows to cross at these crosswalks, FJ installs electric crossing signals, which light up with a green cow icon when it is ok for the cow to cross, and red otherwise. Unfortunately, a large electrical storm has damaged some of his signals. Given a list of the damaged signals, please compute the minimum number of signals that FJ needs to repair in order for there to exist some contiguous block of at least
K
K working signals.
共有N个信号灯,编号为1~N,有B个信号灯损坏,给你它们的编号。
问,最少修好几个信号灯,可以有K个编号连续的信号灯。
输入输出格式
输入格式:
The first line of input contains
N
N ,
K
K , and
B
B (
1 \leq B, K \leq N
1≤B,K≤N ). The next
B
B lines each describe the ID number of a broken signal
输出格式:
Please compute the minimum number of signals that need to be repaired in order for there to be a contiguous block of
K
K working signals somewhere along the road.
输入输出样例
输入样例#1: 复制
10 6 5
2
10
1
5
9
输出样例#1: 复制
1
说明
感谢@ jlyzxxm1 提供题意简述
枚举每个长度为K的子串
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
inline char gc(){
static char now[1<<16],*S,*T;
if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(!isdigit(ch)) {if (ch=='-') f=-1;ch=gc();}
while(isdigit(ch)) x=x*10+ch-'0',ch=gc();
return x*f;
}
const int N=1e5+10;
bool flag[N];
int n,k,b,tmp,ans;
int main(){
freopen("bzoj4996.in","r",stdin);
n=read();k=read();b=read();
for (int i=1;i<=b;++i) flag[read()]=1;
for (int i=1;i<=k;++i) tmp+=flag[i];ans=tmp;
for (int i=k+1;i<=n;++i){
tmp-=flag[i-k];tmp+=flag[i];ans=min(ans,tmp);
}printf("%d\n",ans);
}