1 条题解

  • 1
    @ 2026-7-10 10:46:50

    书接上回http://10.131.7.177/p/P1102

    游客在购买门票时必须说明两个数字,x 和 y,代表他要看展览中的第 x 幅至第 y 幅画(包含 x,y)之间的所有图画,而门票的价钱就是一张图画一元。

    Sept 希望入场后可以看到所有名师的图画。当然,他想最小化购买门票的价格。 请求出他购买门票时应选择的 x,y,数据保证一定有解。 若存在多组解,输出 x 最小的那组。


    题意分析 我们要得到一个区间的两个端点,这个区间出现的数字是1-m至少出现一次 从第二段可看出贪心 使用双指针,左闭右开,表示为[l,r),参观画的作者为al,al+1,...,ar1al,al+1,...,ar-1 考虑贪心策略:固定左指针,右指针向右延伸 sum代表画的数量,num代表画家人数 如果全部可以看到,去除最左边的话,左指针向右 ,右指针也得向右

    代码部分

    #include<iostream>
    using namespace std;
    #define MAXN 1000010
    int n,m,l,r,sum[2005],a[MAXN];
    int ans,ansl,ansr,num;
    int main(){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        l=1,r=1,num=0,ans=MAXN;
        while(l<=r && r<=n+1){
            if(num<m){
                r++;
                sum[a[r-1]]++;
                if(sum[a[r-1]]==1) num++;
            }else{
                if(ans>r-l){
                    ans=r-l;
                    ansl=l;
                    ansr=r-1;
                }
                sum[a[l]]--;
                if(sum[a[l]]==0) num--;
                l++;
            }
        }
        cout<<ansl<<" "<<ansr;
        return 0;
    }
    

    双指针本身就是一个队列。

    学会后自己尝试做http://10.131.7.177/p/P1115

    信息

    ID
    5749
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    15
    已通过
    9
    上传者