打卡信奥刷题(1387)用C++实现信奥 B4098 [CSP-X2022 山东] 动物园

B4098 [CSP-X2022 山东] 动物园

题目描述

某动物园里有 n n n 个场馆和 m m m 种动物( m ≤ n m ≤ n mn)。

n n n 个场馆的编号分别用 1 , 2 , 3 , . . , n 1,2,3, . . , n 1,2,3,..,n 表示; m m m 种动物的编号分别用 1 , 2 , 3 , . . , m 1,2,3, . . , m 1,2,3,..,m 表示。每一个场馆中只饲养了一只动物,不同的场馆可能饲养着相同种类的动物。

这个动物园的门票比较特殊,游客在购买门票时必须说明要参观的场馆的起止编号 a a a b b b(起止编号会打印到游客购买的门票上),代表游客只能参观动物园的第 a a a 个场馆至第 b b b 个场馆(包含 a , b a,b a,b)里的动物,其他的场馆不能去。门票按一个场馆十元收费。

如果你购买的门票的起止场馆编号是 3 3 3 8 8 8,那么你需要花 60 60 60 元钱购买门票,只能观看 3 , 4 , 5 , 6 , 7 , 8 3,4,5,6,7,8 3,4,5,6,7,8 号场馆的动物。

小明希望看到动物园内所有种类的动物,同时小明是个非常节约的孩子,他希望花最少的钱买门票。 请你帮小明计算:他最少需要花费多少钱买门票才能看到所有种类的动物(同一种动物他可能不止看一个)。注意:小明只能买一张门票。

输入格式

第一行两个整数 n , m n,m n,m,分别表示动物园内的场馆数量及动物种类数量。

第二行是 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots,x_n x1,x2,,xn,其中 x i x_i xi 表示第 i i i 个场馆中的动物种类编号。

输出格式

一行一个整数 p p p,表示小明的门票费用。

输入输出样例 #1

输入 #1

12 5
2 5 3 1 3 2 4 1 1 5 3 4 3

输出 #1

60

说明/提示

对于 30 % 30\% 30% 的数据,有 $ n ≤ 200 , m ≤ 20$。

对于 60 % 60\% 60% 的数据,有 n ≤ 1000 , m ≤ 1000 n ≤ 1000 , m ≤ 1000 n1000,m1000

对于 100 % 100\% 100% 的数据,有 1 ≤ n ≤ 10 6 , 1 ≤ x i ≤ m ≤ 2 × 10 3 1 ≤ n≤ 10^6,1 ≤ x_i ≤ m ≤ 2 × 10^3 1n1061xim2×103

C++实现

#include <bits/stdc++.h>
const int N=1e6+5,M=2e3+5;
int tong[M],a[N],n,m,l=1,r,c,mi=0x7fffffff;
signed main(){
	std::cin>>n>>m;
	for(int i=1;i<=n;i++){
		std::cin>>a[i];
	}
	while(r<=n){
		if(c<m){
			r++;
			if(!tong[a[r]])c++;
			tong[a[r]]++;
		}else{
			mi=std::min(r-l+1,mi);
			tong[a[l]]--;
			if(!tong[a[l]])c--;
			l++;
		}
	}
	std::cout<<mi*10;
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值