POJ-3320 Jessica's Reading Problem

来源:互联网 发布:java线程锁 编辑:程序博客网 时间:2024/05/07 10:51
/************************************************* 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,(每一个知识点都有一个整数编号)。全书同一个知识点可能会被提到多次,他希望阅读其中一些连续的页把所有知识点都读到,给定每页所读到的知识点,求最少的阅读页数。

题解:

尺取法。

0 0
原创粉丝点击