[CSP2022 山东小学组] 动物园

描述

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

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

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

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

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

注意:小明只能买一张门票。

输入描述

第一行两个整数 n,m,分别表示动物园内的场馆数量及动物种类数量。
第二行是 x1​,x2​,...,xn​,其中xi​表示第 i 个场馆中的动物种类编号。

输出描述

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

样例输入 1

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

样例输出 1

60 

提示

【样例说明】
样例 1 说明:花费最少的其中一种购票方案选择是 a=2,b=7,表示购买场馆 2,3,4,5,6,7的门票,分别看到的动物是5,3,1,3,2,4 ,其中动物 3 小明看了两个。
【数据范围】
• 对于 30% 的数据,有 n≤200,m≤20。
• 对于 60% 的数据,有 n≤1000,m≤1000。
• 对于 100% 的数据,有 1≤n≤106,1≤xi​≤m≤2×103。

#include<iostream>
#include<cmath>
using namespace std;
const int N=1000010;
const int M=2010;
int n,m;
int l=1;//左端点
int cot=0;//l到i之间动物的种类
int a[N];//ai保存i号场馆存放了什么动物
int b[M];//保存l到i之间每种动物出现的次数
int main() {
    scanf("%d %d",&n,&m);
    int ans=n;
    for(int i=1; i<=n; i++) {
        scanf("%d",&a[i]);
        if(b[a[i]]==0) cot++;
        b[a[i]]++;
        if(cot==m) { //l右移
            for(int j=l; j<=i; j++) {
                if(b[a[j]]>1) {
                    l++;
                    b[a[j]]--;
                }
                else break;
            }
            ans=min(ans,i-l+1);
        }
    }
    printf("%d",ans*10);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值