POJ 3320(尺取+map+set)

题意:一本书有P页,每一页都一个知识点,求去最少的连续页数覆盖所有的知识点。

思路:用map存储对应的知识点的数量来判断sum是否加或减,用set存储不重复的知识点,然后尺取~

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<iostream>  
#include<string>  
#include<vector>  
#include<stack>  
#include<bitset>  
#include<cstdlib>  
#include<cmath>  
#include<set>  
#include<list>  
#include<deque>  
#include<map>  
#include<queue>  
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
map <int,int> M;
set<int> s;
int a[1000005];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            s.insert(a[i]);
        }
        int num=s.size(),l=0,r=0,sum=0,ans=inf;
        while(1)
        {
            while(r<n&&sum<num)
            {
                if(M[a[r++]]++==0)
                {
                    sum++;
                }
            }
            if(sum<num)
            {
                break;
            }
            ans=min(r-l,ans);
            if(--M[a[l++]]==0)
            {
                sum--;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dilly__dally/article/details/82317261