POJ 3320 尺取法,Hash,map标记

1、POJ 3320 

2、链接:http://poj.org/problem?id=3320

3、总结:尺取法,Hash,map标记

  看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识点

  必须说,STL够屌。。

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<map>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const int N=1000100;
int p,a[N];
map<int,int>n,x;

int main()
{
    while(~scanf("%d",&p))
    {
        for(int i=1;i<=p;i++)
        {
            scanf("%d",&a[i]);
            n[a[i]]++;
        }
        int s=n.size();    //记录总类别

        int l=1,r=1,ans=INF;
        while(true)
        {
            while((r<=p)&&(x.size()<s)){    //尺取法,要满足范围要求,否则右端点移动
                x[a[r++]]++;
            }
            if(x.size()<s)break;        
            ans=min(ans,r-l);      
            x[a[l++]]--;
            if(x[a[l-1]]<=0)x.erase(a[l-1]);    //关健点,在范围内这个类别数<=0,就删去

        }
        printf("%d\n",ans);
    }

    return 0;
}
View Code

 

posted @ 2016-08-02 22:38  v9fly  阅读(176)  评论(0编辑  收藏  举报