射箭(arrow)
射箭(arrow)
Description?
FJ很喜歡看射箭比賽,看著運動員們一個個精湛的技藝,令他頭暈目眩膜拜不已。而且他喜歡給那些射箭選手打分,他想如果一位選手能在盡量短的時間段內射出所有可能的環數,那么他的得分就是那段最短時間的長度。
現在,FJ告訴你其中一位選手共射出了n支箭,當然他每個單位時間射出一只箭。FJ還會告訴你他射出的每支箭的環數。而且環數總共的可能性有m種,環數分別為1-m,請你幫他算過這位選手在他心目中的分數。
Input?
輸入文件共兩行
第一行兩個數n,m。
第二行一共n個數表示那位選手每一箭的環數。
Output
輸出文件只有一個數,表示這位選手的得分。如果這位運動員無法在這n箭中射出所有的環數,則輸出-1。
Sample Input?
12 5
2 5 3 1 3 2 4 1 1 5 4 3
Sample Output?
6
說明:這位選手從第2支箭到第7支箭射出了所有可能的環數,因此他的得分是6。
Hint
30% n<=1000 m<=20。
100% n<=1000000 m<=2000。?
算法:
根據下標計數統計環的個數進行添加右邊的環或者刪除左邊的環。
步驟:
1 以環數作為下標從右邊進行添加環的操作,當值為1的時候,表示產生新的環,則進行h的累加;
2 h==m,可以進行比較存儲;
3 h==m,可以從左邊進行刪除環的操作;當環為下標的值為0時,表示失去一個環,就停止刪除,中斷,再繼續從右邊進行增加環的操作;
#include<bits/stdc++.h> using namespace std; long long n,m,ans=INT_MAX,sum,l,r,p,k,c[20000001],s[1000009],x; int main() {cin>>n>>m;for(int i=1;i<=n;i++)cin>>s[i];for(int i=1;i<=n;i++){r=i;x=s[i];c[x]++;if(c[x]==1) k++;if(k==m){p=1;for(;;){sum=r-l+1;if(sum<ans) ans=sum;x=s[l];c[x]--;l++;if(c[x]==0){k--;break;}}}}if(p==0) ans=0;cout<<ans;return 0; }總結
- 上一篇: 一款更懂用户的在线文档创作工具-bakl
- 下一篇: MySQL数据库备份与恢复操作