就是两个指针表示区间[l,r]的开始与结束然后根据题目来将端点移动,是一种十分有效的做法。适合连续区间的问题

3320

这道意思是一本书有n页,每一页上有一个知识点标号a[i]可能重复,要求选择一个最小的区间使得能够覆盖所有知识点

分析:[l,r]区间推进,统计区间中能够覆盖的知识点数,对于每一个l,r都是满足可以覆盖所有知识点的最小r,处理好区间知识点数的统计就好了

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <set>
 5 #include <algorithm>
 6 #include <map>
 7 #include <queue>
 8 #include<cmath>
 9 #include<vector>
10 #define maxn 1000010
11 #define maxm 100010
12 #define mod 1000000000000000000
13 #define INF 0x3f3f3f3f3f
14 using namespace std;
15 int n;
16 int a[maxn];
17 map<int,int>mp;
18 set<int>num;
19 int main (){
20     while(scanf("%d",&n)!=EOF){
21         num.clear();
22         mp.clear();
23         for(int i=0;i<n;++i){
24             scanf("%d",&a[i]);
25             num.insert(a[i]);
26         }
27         int l=0,r=0;
28         int m = num.size();
29         int cnt=0;
30         int ans=n;
31         while(l<n){
32             while(r<n&&cnt<m){
33                 if(mp[a[r]]==0){
34                     cnt++;
35                 }
36                 mp[a[r]]++;
37                 r++;
38             }
39             if(cnt<m)break;
40             ans =min(ans,r-l);
41             mp[a[l]]--;
42             if(mp[a[l]]==0){
43                 cnt--;
44             }
45             l++;
46         }
47         printf("%d\n",ans);
48     }
49 
50 }
poj3320

相关文章:

  • 2022-12-23
  • 2021-08-19
  • 2021-09-21
  • 2021-10-15
  • 2021-11-14
  • 2022-01-22
  • 2021-08-19
  • 2022-12-23
猜你喜欢
  • 2021-05-27
  • 2021-09-11
  • 2022-02-23
  • 2021-08-17
相关资源
相似解决方案