尺取法(挑程)

这个方法就是两个标,一个在后,一个在前,一般都是类似求和满足大于某个数或者怎样的最小个数(目前只会这样的),前面的一直往前走,知道满足条件,然后面的往前走,直到不满足条件。

附poj 3320代码

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <map>
 5 #include <set>
 6 #include <algorithm>
 7 #include <fstream>
 8 #include <cstdio>
 9 #include <cmath>
10 #include <stack>
11 #include <queue>
12 using namespace std;
13 const double Pi=3.14159265358979323846;
14 typedef long long ll;
15 const int MAXN=1000000+5;
16 const ll mod=1e9+7;
17 
18 int a[MAXN];
19 
20 set <int> all;
21 map <int,int> cnt;
22 int main()
23 {
24     int p;cin>>p;
25     map <int,int> cnt;
26     for(int i=1;i<=p;i++)
27     {
28         scanf("%d",&a[i]);
29         all.insert(a[i]);
30         cnt[a[i]]=0;
31     }
32     int n=all.size();
33     int ans=p+1;
34     int s=1,t=1,num=0;
35     while(1)
36     {
37         while(t<=p&&num<n)
38         {
39             if(cnt[a[t]]==0)
40             {    
41                 num++;
42             }
43             cnt[a[t]]++;
44             t++;
45         }
46         if(num<n) break;
47         ans=min(ans,t-s);
48         if(--cnt[a[s++]]==0)
49             num--;
50     }
51     printf("%d",ans);
52     return 0;
53 }

猜你喜欢

转载自www.cnblogs.com/Msmw/p/10427709.html