POJ3320

来源:互联网 发布:lol代升级软件 编辑:程序博客网 时间:2024/06/03 17:20

尺取法做,在某个区间[s,t]已经覆盖了所有的知识点的情况。
有了如下的等价关系,所有的知识点被覆盖等价于每个知识点出现的次数不少于1.

附上代码。

#include<iostream>#include<cstdio>#include<queue>#include<set>#include<algorithm>#include<map>using namespace std;const int MAXN=1E6;int p;int a[MAXN];set<int> all;//计算全部知识点总数map<int,int> count;//知识点->出现次数的映射int main(){    scanf("%d",&p);    for(int i=0;i<p;i++)        scanf("%d",&a[i]);    for(int i=0;i<p;i++)        all.insert(a[i]);    int n=all.size();    //尺取法    int s=0,t=0,num=0;    int res=MAXN;    while(true)    {        while(t<p&&num<n)            if(count[a[t++]]++==0){                num++;            }        if(num<n)break;        res=min(res,t-s);        if(--count[a[s++]]==0){            num--;        }    }    printf("%d\n",res);}
0 0
原创粉丝点击