POJ-3320 Jessica's Reading Problem

/************************************************
* 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,(每一个知识点都有一个整数编号)。全书同一个知识点可能会被提到多次,他希望阅读其中一些连续的页把所有知识点都读到,给定每页所读到的知识点,求最少的阅读页数。

题解:

尺取法。

猜你喜欢

转载自blog.csdn.net/somniloquy_/article/details/49405853