码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3320: Jessicas Reading Problem

时间:2015-07-14 18:18:14      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:poj   尺取法   

Jessica’s Reading Problem ( POJ No.3320)
  为了准备考试, Jessica 开始读一本很厚的课本。要想通过考试,必须把课本中所有的知识点都掌握。这本书总共有 P 页,第 i 页恰好有一个知识点 ai(每个知识点都有一个整数编号)。全书中同一个知识点可能会被多次提到,所以她希望通过阅读其中连续的一些页把所有的知识点都覆盖到。给定每页写到的知识点,请求出要阅读的最少页数。
限制条件
  1 ≤ P ≤ 10^6
输入:
  P = 5
  a = {1, 8, 8, 8, 1}
输出:
  2

解题思路:假设从某一页s开始阅读,为了覆盖所有的知识点读到t页,这样的话如果从s+1开始阅读,那么必须读到t’>=t位置,故可以用尺取法。

int P; //页数
int a[P];  //可能重复的P个知识点
int count[KP]; //知识点计数数组

void solve{
    set<int> all_knowledge;

    for(int i = 0; i < T; i++)
        all_knowledge.insert(a[i]);

    knowledge_total = all_knowledge.size();

    //尺取法
    int start = 0;
    int end = 0;
    int min_pages = P;

    while(1){
        while(end < P && knowledge_cnt < knowledge_total) {
            if(count[a[end++]]++ == 0)
                knowledge_cnt++;
        }

        if(knowledge_cnt < knowledge_total) {
            break;
        }

        min_pages = MIN(min_pages,end - start);

        if(--count[a[start++]] == 0) {
            knowledge_cnt--;
        }
    }

    cout << min_pages<<endl;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 3320: Jessicas Reading Problem

标签:poj   尺取法   

原文地址:http://blog.csdn.net/kzq_qmi/article/details/46878965

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!