標籤:poj 尺取法
Jessica’s Reading Problem ( POJ No.3320)
為了準備考試, Jessica 開始讀一本很厚的課本。要想通過考試,必須把課本中所有的知識點都掌握。這本書總共有 P 頁,第 i 頁恰好有一個知識點 ai(每個知識點都有一個整數編號)。全書中同一個知識點可能會被多次提到,所以她希望通過閱讀其中連續的一些頁把所有的知識點都覆蓋到。給定每頁寫到的知識點,請求出要閱讀的最少頁數。
限制條件
1 ≤ P ≤ 10^6
輸入:
P = 5
a = {1, 8, 8, 8, 1}
輸出:
2
解題思路:假設從某一頁s開始閱讀,為了覆蓋所有的知識點讀到t頁,這樣的話如果從s+1開始閱讀,那麼必須讀到t’>=t位置,故可以用尺取法。
int P; //頁數int a[P]; //可能重複的P個知識點int count[KP]; //知識點計數數組void solve{ set<int> all_knowledge; for(int i = 0; i < T; i++) all_knowledge.insert(a[i]); knowledge_total = all_knowledge.size(); //尺取法 int start = 0; int end = 0; int min_pages = P; while(1){ while(end < P && knowledge_cnt < knowledge_total) { if(count[a[end++]]++ == 0) knowledge_cnt++; } if(knowledge_cnt < knowledge_total) { break; } min_pages = MIN(min_pages,end - start); if(--count[a[start++]] == 0) { knowledge_cnt--; } } cout << min_pages<<endl;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
POJ 3320: Jessicas Reading Problem