题意就是 在P张书页中 其中有重复元素 选取最小连续区间内包括了这期间的所有不同的数 求符合条件的最小区间长度
本题可以用尺取法
所谓尺取 就是选取两个下标 s e 分别指向当前扫面区间的首尾
开始赋值都是1 然后分析数串 把e向后移 找到一种符合条件的区间后再把s向后移不断判断是否符合条件 更新长度
不满足所需e向后 满足所需 s 向前求得最小长度
本题由于要表示数据删除 由于数在区间内不一定只是1个所以删除时用map来表示数量变化 直到该元素在map中值为0时再彻底删除
code:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<map> #include<set> using namespace std; typedef long long ll; int p[1000010]; int main() { int n; ios::sync_with_stdio(0); cin>>n; set<int>a; for(int i=1;i<=n;i++){ cin>>p[i]; a.insert(p[i]); } int all = a.size(); map<int,int>res; int se=1,en=1; int ans =1000010; int sum=0; while(1) { while(en<=n&&sum<all){ if(res[p[en++]]++==0) sum++; } if(sum<all)break; ans = min(en-se,ans); if(--res[p[se++]]==0)sum--; } cout<<ans<<endl; return 0; }
POJ-3061 尺取
最新推荐文章于 2020-01-13 13:32:07 发布