Jessica's Reading Problem POJ 3320(尺取)
原题
题目分析
题目要求一段连续的书页,里面包括了全部知识点,可以考虑尺取,由于知识点的编号无规律,可以考虑用set来记录全部知识点的种数,尺取的过程可以考虑用map来辅助判断区间[s,t]是否包括全部知识点,映射map<知识点编号,个数>,当每种知识点个数至少为1的时候表明[s,t]包含所有知识点.
代码
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 #include <utility> 6 #include <ctime> 7 #include <cmath> 8 #include <cstring> 9 #include <string> 10 #include <stack> 11 #include <queue> 12 #include <vector> 13 #include <set> 14 #include <map> 15 16 using namespace std; 17 typedef unsigned long long ULL; 18 typedef long long LL; 19 typedef long double LB; 20 const int INF_INT=0x3f3f3f3f; 21 const LL INF_LL=0x3f3f3f3f3f3f3f3f; 22 23 set<int> con; 24 map<int,int> barrel; 25 int num[1000000]; 26 27 int main() 28 { 29 // freopen("testdata.in","r",stdin); 30 // freopen("std.out","w",stdout); 31 int N; 32 cin>>N; 33 for(int i=0;i<N;i++) 34 scanf("%d",&num[i]),con.insert(num[i]); 35 int n=con.size(); 36 int l=0,r=0,cnt=1;barrel[num[0]]++; 37 int ans=INF_INT; 38 while(true) 39 { 40 41 while(r<N-1&&cnt<n) 42 { 43 r++; 44 if(barrel[num[r]]==0) 45 cnt++; 46 barrel[num[r]]++; 47 } 48 if(cnt<n) break; 49 ans=min(ans,r-l+1); 50 barrel[num[l]]--; 51 if(barrel[num[l]]==0) cnt--; 52 l++; 53 } 54 printf("%d\n",ans); 55 return 0; 56 }