2020.04.06日常總結——折半搜索

折半搜索\color{green}{\text{折半搜索}}

  • 折半搜索是非常常用的一種剪枝方法。它可以把某些搜索的時間複雜度降至原來的根號級別。

  • 舉個例子,比如我們現在要從 n(1n40)n(1 \leq n \leq 40) 個東西中選擇幾個東西,最後的總價值爲所有東西的價值和,總費用也爲所有東西的價值和,求當總費用 m\leq m 時的最大價值。

    • 我們可以直接用一個 O(2n)O(2 ^ n) 的暴力搜索,然而直接 TLE
    • 但是,我們可以先搜索出前一半的東西的所有可能的總價值和總費用,然後我們在搜索後半段,時間複雜度各自爲 O(2n/2)O(2^{n/2})
    • 然後我們可以對前半段所有的可能解排序,然後枚舉後半段的價值,可以直接通過二分來求解。總時間複雜度爲 O(n2×2n/2)O(\dfrac{n}{2} \times 2^{n/2})
    • 這樣,我們可以通過原題目的數據範圍了!!!上述方法即折半搜索。總的時間複雜度爲 O(2n/2+1+n2×2n/2)O(2^{n/2+1}+\dfrac{n}{2} \times 2^{n/2}),幾乎是直接暴力算法的時間複雜度的根號級別。
  • 在現實生活中,折半搜索也非常常用,比如我們著名的折半攻擊 (雖然是黑客玩的,不是什麼好東西)


洛谷P5194     [USACO05DEC]Scales S\color{green}{\text{洛谷P5194\ \ \ \ \ [USACO05DEC]Scales\ S}}

【題意】:\color{blue}{\text{【題意】:}}
在這裏插入圖片描述
【思路】:\color{blue}{\text{【思路】:}} 細心的讀者可能會發現,這不就是我舉的例子嗎?是的,直接套就好了。

但是,1N1×1031 \leq N \leq 1 \times 10^3,就是用上面的方法也會 TLE 啊!!!

我們發現題目中有這麼一句話:

這一行中從第3個砝碼開始,每個砝碼的質量至少等於前面兩個砝碼(也就是質量比它小的砝碼中質量最大的兩個)的質量的和。

也就是說,最多砝碼的情況是前兩個砝碼都是 11,而後面的砝碼都是前兩個砝碼的和(即斐波那契數列)。重量 >C>C 的砝碼鐵定沒用,所以我們可以編程看看最多的砝碼個數是多少(代碼是 Python 的):

在這裏插入圖片描述

結果爲:
在這裏插入圖片描述

也就是說,最多才 4343 個砝碼(可能更少),題目的數據範圍是吹出來的,我們的算法不用 TLE

【代碼】:\color{blue}{\text{【代碼】:}}

在這裏插入圖片描述
在這裏插入圖片描述


折半搜索真的非常常用!!!大家可以多找找類似的題目做做。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章