首页 > 代码库 > POJ 3320 (尺取法+Hash)
POJ 3320 (尺取法+Hash)
题目链接: http://poj.org/problem?id=3320
题目大意:一本书有P页,每页有个知识点,知识点可以重复。问至少连续读几页,使得覆盖全部知识点。
解题思路:
知识点是有重复的,因此需要统计不重复元素个数,而且需要记录重复个数。
最好能及时O(1)反馈不重复的个数。那么毫无疑问,得使用Hash。
推荐使用map,既能Hash,也能记录对于每个key的个数。
尺取的思路:
①不停扩展R,并把扫过知识点丢到map里,直到map的size符合要求。
②更新结果。
②L++,map里的对应key(a[l++])的个数-1,相当于移出这页。
如果对应的key的个数<=0,则应该erase掉这个key,防止map::size()的误判。
#include "cstdio"#include "map"using namespace std;int a[1000005];int main(){ //freopen("in.txt","r",stdin); int n,s,l=1,r=1,ans=0x3f3f3f3f; scanf("%d",&n); map<int,int> Hash,x; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); Hash[a[i]]++; } s=Hash.size(); while(true) { while(x.size()<s&&r<=n) x[a[r++]]++; if(x.size()<s) break; ans=min(ans,r-l); x[a[l++]]--; if(x[a[l-1]]<=0) x.erase(a[l-1]); } printf("%d\n",ans);}
13593020 | neopenx | 3320 | Accepted | 1520K | 422MS | C++ | 549B | 2014-11-03 00:30:01 |
POJ 3320 (尺取法+Hash)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。