回味尺取法(下)例題 poj3320

2021-10-23 04:08:13 字數 774 閱讀 6350

例題:

題目大意:jessica開始讀一本很厚的書,需要把書中所有知識點都掌握,這本書總共p頁,第i頁恰好有乙個知識點ai,(每個知識點都有乙個整數編號)全書中同乙個知識點可能會被多次提到,所以他希望通過閱讀其中連續的一些頁把所有的知識點都覆蓋到,給定沒有人寫到的知識點,求出閱讀的最少頁數。

樣例:p=5,a=,輸出:2

思路分析:

在某個區間[s,t]已經覆蓋了所有的知識點的情況下,下乙個區間[s+1,t']要如何求出呢?

所有的知識點被覆蓋《=》每個知識點出現的次數都不小於1;

由於以上等價關係,我們可以用二叉樹等資料結構來儲存[s,t]區間上每個知識點出現的次數,這樣把最開頭的頁s去除後便可以判斷[s+1,t]是否滿足條件。

從區間把最開頭取出後,頁s上出現的知識點的出現次數就要減一,如果此時這個知識點的出現次數為0的話,在同乙個知識點出現之前一直不斷將區間末尾t向後退即可,每次在區間末尾追加t頁時將t頁上的知識點出現次數+1即可,這樣就完成了下乙個區間上各個知識點出現次數的更新,通過重複這一操作可以以0(plogp)的複雜度求出最小的區間。

int p;

int a[max_p];

void solve()

if (num < n)break;

res = min(res, t - s);

if (--count[a[s++]] == 0)//某個知識點出現的次數變為0

num--;

} cout << res << endl;

}

回味尺取法(上)(有白書例題)

例題 給定長度為n的數列整數a0,a1,a2,an 1,以及整數s,求出總和不小於s的連續子串行的長度的最小值,如果不存在輸出0.尺取法的思路 1 以s t sum 0初始化。2 只要有sum 3 如果 2 中的要求無法滿足sum s則終止,否則的話更新res min res,t s 4 將sum減...

尺取法及例題

尺取法 顧名思義,像尺子一樣取一段,借用挑戰書上面的話說,尺取法通常是對陣列儲存一對下標,即所選取的區間的左右端點,然後根據實際情況不斷地推進區間左右端點以得出答案。之所以需要掌握這個技巧,是因為尺取法比直接暴力列舉區間效率高很多,尤其是資料量大的時候,所以尺取法是一種高效的列舉區間的方法,一般用於...

常用技巧之 尺取法 理解 例題

尺取法的複雜度為 o n 主要應用有關連續性的問題,基本原理就是反覆地推進區間的開頭和末尾,來求取滿足條件的最小區間,或者相似的應用。尺取法在別的地方又被稱為滑動視窗或者蠕蟲演算法,我覺得蠕蟲演算法這個名稱用的相當恰當啊,就是一步一步地往後移動,一直找到答案,而不用遍歷回溯什麼的,也就是因為這樣,他...