poj---3320Jessica's Reading Problem
题意:
求覆盖数组中出现过的所有元素的最小的区间长度(连续)
tips:
1.刚开始左右区间都在初始零位置,然后右端点右移直到区间满足条件,再开始右移左端点,移动后判断是否满足条件,不满足,右端点向右移至再次满足条件,重复以上
2.尺取法维护的也是区间的信息---满足条件的区间的最小的信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//尺取法,维护的也是区间的信息,满足条件的最小的长度 //白书p150 //++ -- == 运算的先后顺序 #include<cstdio> #include<algorithm> #include<set> #include<map> using namespace std; const int MAXN=1000001; int a[MAXN]; int P; int main(){ while(scanf("%d",&P)!=EOF){ set<int > all; for(int i=0;i<P;i++){ scanf("%d",&a[i]); all.insert(a[i]); } int n=all.size(); int ans=P; int s=0,t=0,num=0; map<int ,int > countt; for(;;){ while(t<P && num <n){ if(countt[a[t++]]++ == 0){//countt先判断 == 0 再自增 num++; } } if(num < n) break; ans=min(ans,t-s); if(--countt[a[s++]] == 0){ num--;//左端点后移时,使区间内某个元素消失了 } } printf("%d\n",ans); } return 0; }