题目描述
某动物园里有𝑛个场馆和𝑚种动物(𝑚≤𝑛)。
𝑛n个场馆的编号分别用 1,2,3,..,𝑛表示;𝑚m种动物的编号分别用 1,2,3,..,𝑚 表示。每一个场馆中只饲养了一只动物,不同的场馆可能饲养着相同种类的动物。
这个动物园的门票比较特殊,游客在购买门票时必须说明要参观的场馆的起止编号𝑎a和𝑏b(起止编号会打印到游客购买的门票上),代表游客只能参观动物园的第𝑎个场馆至第𝑏个场馆(包含 𝑎,𝑏)里的动物,其他的场馆不能去。门票按一个场馆十元收费。
如果你购买的门票的起止场馆编号是 3 到 8,那么你需要花 60 元钱购买门票,只能观看3,4,5,6,7,8号场馆的动物。
小明希望看到动物园内所有种类的动物,同时小明是个非常节约的孩子,他希望花最少
的钱买门票。 请你帮小明计算:他最少需要花费多少钱买门票才能看到所有种类的动物(同
一种动物他可能不止看一个)。注意:小明只能买一张门票。
输入格式(输入文件为 zoo.in)
第一行两个整数 𝑛,𝑚,分别表示动物园内的场馆数量及动物种类数量。
第二行是 𝑥1,𝑥2,⋯,𝑥𝑛,其中𝑥𝑖表示第𝑖个场馆中的动物种类编号。
输出格式(输出文件为 zoo.out)
一行一个整数𝑝,表示小明的门票费用。
输入输出样例
样例 1 输入
12 5
2 5 3 1 3 2 4 1 1 5 4 3
样例 1 输出
60
样例 11 说明:花费最少的其中一种购票方案选择是 𝑎=2,𝑏=7,表示购买场馆 2,3,4,5,6,7的门票,分别看到的动物是5,3,1,3,2,4,其中动物3小明看了两个。
AC代码
#include<bits/stdc++.h>
using namespace std;
queue<int> q;
int n,m,a[1000008],vis[2008];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int L=1,R=0,cnt=0,ans=0x3f3f3f;
while(R<n){
while(cnt<m&&R<n){
R++;
vis[a[R]]++;
if(vis[a[R]]==1) cnt++;
}
while(cnt==m){
ans=min(ans,R-L+1);
vis[a[L]]--;
if(vis[a[L]]==0) cnt--;
L++;
}
}
cout<<ans*10;
return 0;
}