POJ - 3320 Jessica's Reading Problem 尺取法+映射 重庆一中高2018级竞赛班第三次测试 2016.7.24 Problem 4

Jessica为了考试需要阅读一本包含多个知识点的书。此题探讨如何利用尺取法等算法找到覆盖所有知识点所需的最少连续页数。

【问题描述】
为准备考试,Jessica开始阅读一本很厚的课本。要想通过考试,必须把课本中所有知识点都掌握。这本书总共有P页,第i页恰好有一个知识点a[i](每个知识点都有一个整数编号)。全书中同一个知识点可能会被多次提到,所以她希望通过阅读其中连续的一些页把所有的知识点都覆盖到。给定每页写到的知识点,请求出要阅读的最少页数。

【输入格式】
第一行一个整数P,表示书本的总页数。接下来的一行,包含P个整数,第i整数表示第i页包含的知识点的编号。

【输出格式】
一个整数,表示需要阅读的最少连续页数。

【输入样例】

5
1 8 8 8 1

【输出样例】

2

【数据范围】
1<=P<=10^6 , 1<=a[i]<=10^9

【来源】
POJ Monthly–2007.08.05, Jerry

思路:尺取法,输入时用set统计元素种类数,运用尺取法的同时用map记录窗口中的元素种类数。

/*
    Name: Jessica's_Reading_Problem
    Copyright: Twitter & Instagram @stevebieberjr
    Author: @stevebieberjr
    Date: 28/07/16 10:00
*/
#include<cstdio>
#include<set>
#include<map>
using namespace std;

int a[1000005];
set<int>s;
map<int,int>mp;

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        s.insert(a[i]);
    }
    int len=s.size();
    int ans=n,p=0,q=0;
    while(1)
    {
        while(q<n && mp.size()<len) mp[a[q++]]++;
        if(mp.size()<len) break;
        ans=min(ans,q-p);
        mp[a[p]]--;
        if(mp[a[p]]==0) mp.erase(a[p]);
        p++;
    }
    printf("%d\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值