POJ 3320 Jessica's Reading Problem 尺取法

http://poj.org/problem?id=3320

题目大意:

某人读一本书,要看完所有的知识点,这本书共有P页,第i页恰好有一个知识点ai,(每一个知识点都有一个整数编号)。全书同一个知识点可能会被提到多次,他希望阅读其中一些连续的页把所有知识点都读到,给定每页所读到的知识点,求最少的阅读页数。

思路:

和上一题一样,也是尺取法的应用。

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

用上Map来统计次数,取出前一项要把对应的知识点的编号次数-1.详见代码。


#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int MAXN=1000000+10;
const int INF=0x3fffffff;
int a[MAXN];
set<int> s;
map<int,int> x;
int main()
{
	int p;
	while(~scanf("%d",&p))
	{
		for(int i=0;i<p;i++)
			scanf("%d",&a[i]);
		
		s.clear();
		for(int i=0;i<p;i++)
			s.insert(a[i]);
		int n=s.size();
		int s=0,t=0,ans=INF,cnt=0;
		while(true)
		{
			while(cnt<n && t<p)
			{
				if(x[ a[t++] ]++==0)
					cnt++;
			}
			if(cnt<n)  break;
			ans=min(ans,t-s);
			if(--x[a[s++]]==0)
				cnt--;		
		}
		printf("%d\n",ans);
	}
	return 0;
}


转载于:https://www.cnblogs.com/murmured/p/5004064.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值