poj3320

#include <iostream>
#include <stdio.h>
#include <set>
# include <map>

using namespace std;

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

int main()                  /*尺取法*/
{   //freopen("in.txt","r",stdin);
    cin>>p;
    com.clear();    /*初始化*/
    mp.clear();
    for (int i=1;i<=p;i++)
    {
        scanf("%d",&a[i]);
        com.insert(a[i]);
    }
    int total,sum=0;
    total=com.size();  /*统计不同的数据的个数*/
    int ans=p,left=1,right=1;
    while (left<=p&&right<=p)  /*防止越界*/
    {
        if (mp[a[right]]==0) sum++;  /*统计当前不同数据的个数*/
        mp[a[right]]++;             /*统计每个数据出现的次数*/
        while (mp[a[left]]>1)       /*如果区间的第一个数重复则首指针向后移*/
        {
            mp[a[left]]--;
            left++;
        }
        if (sum==total)      /*找到了一个字串*/
           {
               if (right-left+1<ans) ans=right-left+1;
               if (mp[a[left]]==1) sum--;             /*寻找下一个子序列,首指针向后移*/
               mp[a[left]]--;
               left++;
           }
        right++;   /*考察下一个数*/

    }
    cout << ans << endl;
    return 0;
}
题意:
书一共p页,第i页有一个知识点a[i],同一个知识点可以多次出现,想要读连续的书页把所有的知识点覆盖,求要读的最少的页数
思路:
首先set记录所有的知识点
假设从第s页到第t页刚好覆盖所有知识,记录下一个answear,那么s++继续增大t直到再次覆盖所有的知识,就又得到一个answear,去两个answear的最小值,同理继续增大s

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值