C++动物园

题目描述

某动物园里有𝑛个场馆和𝑚种动物(𝑚≤𝑛)。

𝑛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 52 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值