• 数字串


    描述

    给你一个长度为n的数字串,数字串里会包含1-m这些数字。如果连续的一段数字子串包含了1-m这些数字,则称这个数字字串为NUM串。你的任务是求出长度最短的NUM串是什么,只需要输出这个长度即可。

    输入

    输入数据有多组

    第一行给定n和m。 (1<=n,m<=100000)
    第二行n个数,表示数字串,数字间用空格隔开。

    以0 0结束

    输出

    如果存在NUM串则输出最短NUM串长度,否则输出"NO"

    样例输入

    5 3
    1 2 2 3 1
    0 0

    样例输出

    3

    解题思路:二分枚举最小满足点

    #include <bits/stdc++.h>
    using namespace std;
    int a[100005],b[100005];
    int n,m;
    int f(int k)
    {
        for(int i=1;i<=n;i++) b[i]=0;
        int f=0,s=0;
        for(int i=1;i<=k;i++)
        {
            if(b[a[i]]==0) s++; 
            b[a[i]]++;
        }
        if(s==m) return 1;
        for(int i=k+1;i<=n;i++)
        {
            b[a[i-k]]--;
            if(b[a[i-k]]==0) s--;
            if(b[a[i]]==0) s++;
            b[a[i]]++;
            if(s==m) f=1;    
        }
        return f;
    }
    int main()
    {
        while(scanf("%d%d",&n,&m),n+m)
        {
            int ans=n;
            for(int i=1;i<=n;i++) scanf("%d",&a[i]);
            int l=1,r=n;
            int mid;
            while(l<=r)
            {
                mid=(l+r)/2;
                if(f(mid))
                {
                    r=mid-1;
                    ans=min(ans,mid);
                }
                else l=mid+1;
            }
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    第二次作业
    第一次软件测试
    activity带数据跳转
    学生注册界面
    activity_main
    购物商城
    2021.4.14JSP第七周作业
    2021.4.7jsp第六周作业
    2021.3.26JSP第四次作业
    2021/3/10 第二次JSP作业
  • 原文地址:https://www.cnblogs.com/ww123/p/10336204.html
Copyright © 2020-2023  润新知