POJ 3320 Jessica's Reading Problem(尺取法)
2016-04-24 13:07
471 查看
题目链接:
POJ 3320 Jessica’s Reading Problem
题意:
一本P页的书,第i页恰好有一个知识点a[i](每个知识点都有一个编号)。全书中同一个知识点可能会被多次提到,需要连续阅读一些连续的页将所有知识点都覆盖到。给定每页写的知识点,求出最少要阅读的页数。
POJ 3320 Jessica’s Reading Problem
题意:
一本P页的书,第i页恰好有一个知识点a[i](每个知识点都有一个编号)。全书中同一个知识点可能会被多次提到,需要连续阅读一些连续的页将所有知识点都覆盖到。给定每页写的知识点,求出最少要阅读的页数。
//2056K 485MS #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <cmath> #include <ctime> #include <cassert> #include <set> #include <map> #define IOS ios_base::sync_with_stdio(0); cin.tie(0) using namespace std; const int MAX_P=1000010; int P; int id[MAX_P]; void solve() { //计算所有知识点个数 set<int> all; for(int i=0;i<P;i++){ all.insert(id[i]); } int total=all.size(); int res=P,num=0,st=0; map<int,int> mp; //用map建立映射以记录出现次数 for(int i=0;i<P;i++){ mp[id[i]]++; if(mp[id[i]]==1){ num++; if(num==total){ int j; for(j=st;j<i;j++){ mp[id[j]]--; if(mp[id[j]]==0) break; } //printf("j=%d i=%d\n",j,i); res=min(res,i-j+1); st=j+1; num--; } } } printf("%d\n",res); } int main() { freopen("poj3320in.txt","r",stdin); IOS; while(~scanf("%d",&P)){ for(int i=0;i<P;i++){ scanf("%d",&id[i]); } solve(); } return 0; }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- POJ 1200 Crazy Search(简单哈希)
- 【高手回避】poj3268,一道很水的dijkstra算法题