題解【洛谷P3662】[USACO17FEB]Why Did the Cow Cross the Road II S
阿新 • • 發佈:2019-02-28
記錄 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