码迷,mamicode.com
首页 > 其他好文 > 详细

POJ - 3320 Jessica's Reading Problem(尺取法+STL)

时间:2017-07-01 14:30:07      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:成功   include   ++   一个   org   http   scanf   ==   break   

题目链接:http://poj.org/problem?id=3320

题意:一本n页的书(有很多重复的页),要求连续最少页数把这本书每种页都包括进去,求出最少页数。

 

例如1 8 8 8 1

就1和8两种页,第一次1 8连续两页就把每种页都包括进去了。

 

尺取法:顾名思义就是一段一段的取。一开始一直往后取,符合条件,然后进行前面减少操作,不符合条件再往后取。

如此重复,得到最优的解。这道题目给出的页的标记好像有特别大的,直接用数组的话会爆炸。

试过用vector,但是对vector的操作太麻烦了。一开始里面没有值,所以对应输出的是一个随机大数。

然后++和--操作还无法成功,要单独拿出来+1。看网上大牛们都是用map,试了下map发现
map里面一开始就把每个对应地点的值初始化为0。再用一个set找到不相同页的数量,整道题就简单了。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <map>
 5 #include <set>
 6 using namespace std;
 7 
 8 const int N=1000000+10;
 9 const int INF=0x3f3f3f3f;
10 int a[N];
11 
12 int main(){
13     map <int,int> b;
14     set <int> s;
15     int n,temp;
16     scanf("%d",&n);
17     for(int i=0;i<n;i++) {scanf("%d",&a[i]);s.insert(a[i]);}
18     int num=s.size();
19     int sum=0,ans=INF;
20     int st=0,en=0;
21     while(1){
22         while(sum<num&&en<n){
23             if(b[a[en++]]++==0) sum++;
24         }
25         if(sum<num) break;
26         ans=min(ans,en-st);
27         if(--b[a[st++]]==0) sum--;
28     }
29     printf("%d\n",ans);
30     return 0;
31 }

 

POJ - 3320 Jessica's Reading Problem(尺取法+STL)

标签:成功   include   ++   一个   org   http   scanf   ==   break   

原文地址:http://www.cnblogs.com/Leonard-/p/7102154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!