1. 程式人生 > >題解【洛谷P3662】[USACO17FEB]Why Did the Cow Cross the Road II S

題解【洛谷P3662】[USACO17FEB]Why Did the Cow Cross the Road II S

記錄 sum 快速 name lin 當前 col har ++

本題是練習前綴和的好題!
我們可以枚舉前端點,確定一個長度為k的區間,然後利用前綴和統計區間內損壞的燈的數量,最後取最小值即可。
AC代碼:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 inline int read()//快速讀入 
 6 {
 7     int f=1,x=0;
 8     char c=getchar();
 9 
10     while(c<0 || c>9)
11     {
12         if(c==-)f=-1;
13         c=getchar();
14 } 15 16 while(c>=0 && c<=9) 17 { 18 x=x*10+c-0; 19 c=getchar(); 20 } 21 22 return f*x; 23 } 24 25 int n,k,b,v[100005],s[100005],sum=2000000007; 26 27 int main() 28 { 29 n=read(),k=read(),b=read();//輸入 30 31 for(register int i=1; i<=b; i++)
32 { 33 int x=read(); 34 35 v[x]=1;//記錄損壞的燈的編號 36 } 37 38 for(register int i=1; i<=n; i++) 39 { 40 s[i]=s[i]+s[i-1]+v[i];//計算從1~i損壞的燈的個數 41 } 42 43 for(register int i=1; i<=n-k+1; i++)//枚舉區間 44 { 45 if((s[i+k-1]-s[i-1])<sum)//
如果這個區間損壞的燈數比當前最小值小 46 { 47 sum=s[i+k-1]-s[i-1];//就更新最小值 48 } 49 } 50 51 printf("%d",sum);//輸出最小值 52 53 return 0;//結束 54 }

P.S. 這是本人在洛谷上AC的第400題。

題解【洛谷P3662】[USACO17FEB]Why Did the Cow Cross the Road II S