/************************************************
* Author :somniloquy
* Created Time :2015/10/25 15:55:24
************************************************/
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const int p_max = 1e6 + 5;
int page[p_max];
int p;
int main(void)
{
while(~scanf("%d", & p))
{
set <int> kind;
for(int i = 0; i < p; i ++)
{
scanf("%d", & page[i]);
kind.insert(page[i]);
}
int n = kind.size(); //调用set的用处 就是为了计算书中有多少种知识点
map <int, int> count; //每个知识点出现的次数
int op = 0, ed = 0, ans = p, num = 0;
while(1)
{
while(ed < p && num < n) //尾光标范围在0 ~ p - 1 当num == n的时候弹出
{
if(count[page[ed]] == 0) //如果有新的知识点
num ++; //当前总数 +1
count[page[ed]] ++; //知识点次数 +1
ed ++; //ed向后移动
}
if(num < n) //如果经过循环到ed == p - 1都不能使 num == n 就弹出
break;
ans = min(ans, ed - op); //ans 取最小
count[page[op]] --; //头光标所指的页数后移(去掉当前页)
if(count[page[op]] == 0) //如果归零 则当前总数-1
num --;
op ++; //头光标后移
}
printf("%d\n", ans);
}
return 0;
}
题目:
某人读一本书,要看完所有的知识点,这本书共有P页,第i页恰好有一个知识点ai,(每一个知识点都有一个整数编号)。全书同一个知识点可能会被提到多次,他希望阅读其中一些连续的页把所有知识点都读到,给定每页所读到的知识点,求最少的阅读页数。
题解:
尺取法。