例子
在這裡我將演示怎麼運用我們所討論的來解決乙個topcoder問題。為了這個我選擇了乙個難度適中的題目,fairworkload
,是在srm169中div1中level 2的。
對於這個問題,許多任務人需要檢查很多檔案櫥櫃。這些櫥櫃不都是相同的大小的,我們知道每個櫥櫃可以容納幾個資料夾。題目要求我們找到乙個安排能夠使每個工人所檢查資料夾的最大數量最小,並且乙個工人的檢查櫥櫃必須是相鄰的。
在熟悉了這個問題之後,需要一點點創造裡。設想我們我們可以支配的工人的數量是沒有限制的。關鍵的是,對於對於一些數max,我們可以計算我們所需要用來檢測最小的工人數量使得每個工人檢查不超過max數量的資料夾(如果有)。現在來看怎麼實現它。一些工人需要檢查第乙個櫥櫃,所以我們派任意乙個工人去。但是因為櫥櫃必須按照順序來分配(乙個工人不能檢查檢查1和3而跳過2),把第二個櫥櫃分配給他也是必須的,如果假如不查過前邊的限度(max)。如果超過了限度,那麼我們就讓他做這些工作,讓另外乙個人去檢查第二個櫥櫃。我們像這樣一直處理,知道所有的櫥櫃都被分配且可以斷定我們使用了最少的工人,在我們假設的限制下。在這裡注意到工人的數量和max成反比:限度越高,我們需要的工人越少。
現在,如果你再回過頭,仔細在問題的敘述中我們還需要什麼,我們要知道最小的max,它要比可用的工人數量要少或者相等。有了這些之後,我們就基本上解決了問題,我們要做的是聯絡起來看怎麼才滿足這個我們使用二分搜尋來解決的框架。
當重新理解來滿足我們需要之後,我們可以檢查這個斷言「工作量被分配後每個工人檢查不超過x的資料夾,在可用工人數量的限制下?」這就得到了二分搜尋解決的第一部分。我們現在需要證明它滿足主要理論。但是觀察到增加x實際上是放鬆了最大工人的數量的限制,所以我們我們可以獲得相同或者更少的工人。因此,如果這個斷言得出yes在x下,它也會得到yes對於所有大於x的值。
完成**,這裡是使用stl來解決這個問題的片段:
注意要仔細選擇上界和下界:你可以用充分大的整數來代替上界,但是下界必須不能夠比最大的櫥櫃少來避免乙個櫥櫃都不能被任何乙個工人檢查的情形,這種情況不能那個被這個斷言正確的處理。乙個選擇是把下界設定為0,然後在斷言中單獨處理特別小的x。
為了證實這個解決方案不會死迴圈,我使用乙個小的no/yes例子資料夾為工人數量為1。
整體的時間複雜度是o(n log size),這裡size是搜尋空間的大小。這是相當快的了。
你所看到的,我們用貪心來處理斷言。在其他問題中,處理斷言可以為乙個簡單的數學表示式來找到最大基數的二部圖匹配。
總結
如果你學習這個是沒有放棄,你應該準備好解決任何可以用二分搜尋的題目。試這把下面的事情記住:
設計乙個能夠被二分搜尋呼叫的搞笑的斷言
決定你要什麼和編寫什麼,那樣搜尋空間才一直有(如果有的話)
如果搜尋空間由整數組成,用兩個數的測試用例來檢查是否會死迴圈
證明上界和下界不超過限制:最好放寬,只要不違背斷言
二分查詢 Binary Search
打算重返c c 陣營,所以準備從演算法開始溫習,今天我們談到的是一種效率較高的查詢方法 二分查詢。什麼是二分查詢 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。二分查詢的基本思想是 1 首先確定該區間的中點位置 ...
二分查詢 BinarySearch
前置條件 乙個有序的序列 假設公升序排列 在序列中查詢指定元素 演算法 首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就在當前序列的前半部分繼續查詢,直到找到相同的元素,或者所查詢的序列範圍為空為止。int binarysearch vector ...
二分查詢 BinarySearch
二分查詢又稱為折半查詢 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢...