POJ 3320Jessica's Reading Problemc(尺取法)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3320Jessica's Reading Problemc(尺取法)相关的知识,希望对你有一定的参考价值。
题意
P个数,求最短的一段包含P个数里所有出现过的数的区间。
分析
尺取法,边读边记录每个数出现次数num[d[i]],和不同数字个数n个。
尺取时,l和r 代表区间两边,每次r++时,d[r]知识点出现次数+1,d[l]知识点出现次数大于1时,次数--,l++,直到d[l]出现次数为1,当不同知识点数量达到n,且区间更小,就更新答案。
代码
#include <cstdio> #include <map> using namespace std; map <int,int> num,v; int p,l,r,n,cnt; int d[1000005]; int ans=9999999; int main() { scanf("%d", &p); for (int i = 0; i < p; i++) { scanf("%d",&d[i]); if (num[d[i]]==0) { n++; } num[d[i]]++; } l=0; r=0; while(l<p && r<p) { if (v[d[r]]==0) { cnt++; } v[d[r]]++; r++; while (v[d[l]]>1) { v[d[l]]--; l++; } if (cnt==n && r-l < ans) { ans=r-l; } } printf("%d",ans); return 0; }
以上是关于POJ 3320Jessica's Reading Problemc(尺取法)的主要内容,如果未能解决你的问题,请参考以下文章
POJ - 3320 Jessica's Reading Problem
(尺取法)POJ 3320 Jessica's Reading Problem
POJ 3320Jessica's Reading Problem (尺取法)
poj3320 Jessica's Reading Problem