问题标题: 酷町堂:4374 买糖果(candy)

0
0
已解决
张恩泽
张恩泽
高级天翼
高级天翼

4374   买糖果(candy)

经验值:1600 时间限制:1000毫秒

题目描述 Description

小卖部现在在 n 个盒子里摆放了正在出售的 m (m <= n)种不同口味糖果。每种糖果售价1元。
小P希望可以尝到所有口味的糖果,但是他没有足够多的钱。他只能一次**买从第a个盒子到第b个盒子的所有糖果。
为了尝到所有口味的糖果,又不愿意花太多的钱。小P想请你写一个程序决定他买糖果的策略,即求出 a 和 b 的值。

输入描述 Input Description

第一行是 N 和 M,分别代糖果盒子的总数和糖果的种数。

其后的一行包含 N 个数字,它们都介于 1 和 M 之间,代表该糖果是哪种口味。

输出描述 Output Description

a和 b(a<=b) 由一个空格符所隔开。

保证有解,如果多解,输出a最小的。

样例输入 Sample Input

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

样例输出 Sample Output

2 7

数据范围及提示 Data Size & Hint

约定 30%的数据N<=200 , M<=20

60%的数据N<=10000 , M<=1000

100%的数据N<=1000000 , M<=2000

 

给点思路就行


0
已采纳
武奕楷
武奕楷
新手天翼
新手天翼

核心:

int i=1,j=m;
    while(j<=n){
        while(j<=n&&ans!=m){
            if(cnt[a[++j]]==0) ans++;
            cnt[a[j]]++;
        }
        if(j-i+1<minn){
            x=i,y=j,minn=j-i+1;
        }
        cnt[a[i]]--;
        if(cnt[a[i]]==0) ans--;
        i++;
    }
    cout<<x<<" "<<y;

 

0
0
我要回答