问题链接:POJ3320 Jessica’s Reading Problem。
题意简述:
一本书有P页,每一页都一个知识点,求最少的连续页数覆盖所有的知识点。
问题分析:
用尺取法来解决。每读一页知识点就有可能增加,是单调递增的,满足用尺取法解决问题的条件。
先求出最前面的子序列,使之覆盖所有知识点;
重复后面一步,直到p个元素都使用到;
去掉子序列的第1个元素,子序列的后面再加上其他元素,使之满足子序列覆盖所有知识点的条件,找出最小的长度。
#include <iostream>
#include <set>
#include <map>
#include <stdio.h>
using namespace std;
const int N = 1000005;
int a[N];
set<int> se;
map<int,int> ma;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
se.insert(a[i]);
int dif=se.size();
int l=0,r=0,num=0,minn=n;
while(1)
{
while(r<n && num<dif) //往右延伸到包含所有元素
if(ma[a[r++]]++ == 0)
num++;
if(num < dif) break; //右面凑不齐
minn=min(minn,r-l);
if(--ma[a[l++]] == 0) //左指针右移一位
num--;
}
cout<<minn;
}
}