149_Jessica's Reading problem 尺取法 (POJ No 3320)
2016-01-09 14:16
197 查看
一本书中,每一页有一个知识点,希望连续的看一些页数,能包含所有的知识点。请问最短的连续页数是几页?
同样可以用尺取法来求解。首先用set来统计不同知识点的个数。
然后定义s,t,t不断右移动,然后压入map, map的索引是知识点编号,值是知识点现在在此子序列中出现的个数。如果压入map之前,
值为0,说明找到一个新的知识点,num++,直到num为知识点总的的个数为止
然后扣去s,再把s右移动一位,吧扣掉的在map中数量减去1,如果剪完之后值为0,书名知识点消失,num--
循环结束,再考虑t的右移的问题。
题源来自《挑战程序竞赛》第二版149页,示例程序写的足够简洁明了效率高,可以借鉴参考:
同样可以用尺取法来求解。首先用set来统计不同知识点的个数。
然后定义s,t,t不断右移动,然后压入map, map的索引是知识点编号,值是知识点现在在此子序列中出现的个数。如果压入map之前,
值为0,说明找到一个新的知识点,num++,直到num为知识点总的的个数为止
然后扣去s,再把s右移动一位,吧扣掉的在map中数量减去1,如果剪完之后值为0,书名知识点消失,num--
循环结束,再考虑t的右移的问题。
题源来自《挑战程序竞赛》第二版149页,示例程序写的足够简洁明了效率高,可以借鉴参考:
// // 149_reading problem.cpp // changlle // // Created by user on 1/9/16. // Copyright (c) 2016 user. All rights reserved. // #include <iostream> #include <set> #include <map> using namespace std; int P=5; int a[5]={1,8,8,8,1}; void solve() { set<int> all; for (int i=0;i<P;i++) { all.insert(a[i]); } int n=all.size(); //统计有多少个不同的元素 int s=0,t=0,num=0; map<int,int> count; //知识点及对应出现的个数。 int res=P; for (;;){ while (t<P && num<n) { if (count[a[t++]]++==0) num++; } if (num<n) break; //到头还没有找齐所有知识点 res=min(res,t-s); if (--count[a[s++]]==0) num--; } cout<<res<<endl; } int main() { solve(); return 0; }
相关文章推荐
- offsetof与container_of宏[总结]
- 学会使用IntelliJ IDEA 12 之教程二 (字体设置,光标设置)
- 查找算法:二分查找、顺序查找
- 各种yum源问题
- 算法洗脑系列(8篇)——第四篇 枚举思想
- Nginx下实现pathinfo及ThinkPHP的URL Rewrite模式支持
- 谈谈使用promise时候的一些反模式
- Hadoop之MapReduce程序应用三
- sqlserver2008通过mdf与ldf还原数据库
- 重拾编程之路--leetcode(java)-排序数组范围
- 漫漫路遥,且行且惜
- ExpandableListView实例
- 迭代最近点算法 Iterative Closest Points
- MySQL的lock tables和unlock tables的用法(转载)
- Easyui数据表格-地区列表及工具栏增删改
- linux空格符号
- 数据库外键可以为空
- php导入导出cvs文件格式
- C开源hash代码uthash的用法总结
- Git简明教程