首页 > 其他 > 详细

【POJ 3320】Jessica's Reading Problemc(尺取法)

时间:2016-02-18 10:02:45      阅读:153      评论:0      收藏:0      [点我收藏+]

题意

P个数,求最短的一段包含P个数里所有出现过的数的区间。

分析

  尺取法,边读边记录每个数出现次数num[d[i]],和不同数字个数n个。

  尺取时,l和r 代表区间两边,每次r++时,d[r]知识点出现次数+1,d[l]知识点出现次数大于1时,次数--,l++,直到d[l]出现次数为1,当不同知识点数量达到n,且区间更小,就更新答案。

代码

#include <cstdio>
#include <map>
using namespace std;

map <int,int> num,v;
int p,l,r,n,cnt;
int d[1000005];
int ans=9999999;

int main()
{
    scanf("%d", &p);
    for (int i = 0; i < p; i++)
    {
        scanf("%d",&d[i]);

        if (num[d[i]]==0)
        {
            n++;
        }

        num[d[i]]++;
    }

    l=0;
    r=0;

    while(l<p && r<p)
    {
        if (v[d[r]]==0)
        {
            cnt++;
        }

        v[d[r]]++;
        r++;

        while (v[d[l]]>1)
        {
            v[d[l]]--;
            l++;
        }
        if (cnt==n && r-l < ans)
        {
            ans=r-l;
        }
    }
    printf("%d",ans);
    return 0;
}

  

【POJ 3320】Jessica's Reading Problemc(尺取法)

原文:http://www.cnblogs.com/flipped/p/5197138.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!