500ms
#include <iostream>
#include<cstdio>
#include<map> //知识点和出现次数的映射
#include<set>
#include<algorithm>
using namespace std;
const int maxn=1000000;
int p;
int a[maxn];
map<int,int> maze;
set<int>all;
int res;
int main()
{
while(scanf("%d",&p)==1)
{
for(int i=0;i<p;i++)
{
scanf("%d",&a[i]);
all.insert(a[i]);
}
int n=all.size(); //所有不同知识点的个数
int s=0,t=0,num=0; //s为前界,t为后界
res=p; //储存最小的连续页数
//尺取法
for(;;)
{
while(t<p&&num<n) //未得到全部知识点
{
if(maze[a[t]]==0) //得到新的知识点
num++;
maze[a[t]]++;
t++;
}
if(num<n) break;
res=min(res,t-s);
maze[a[s]]--;
if(maze[a[s]]==0) num--;
s++;
}
cout<<res<<endl;
}
return 0;
}
POJ 3320
最新推荐文章于 2021-10-14 20:07:21 发布