本篇是在學習理解貪心的過程中留下的理解和記錄,主要是通過幾個題目來理解貪心的思路
只顧眼前,但是卻能得到最優解,讓眼前的浪費是最小的
不能保證是唯一的最優解但是一定是最優解之一
直觀地表示就是只考慮區域性,每次都拿最合適的乙個,最後得到的就一定是最優解,但是如果出現多種限制條件的話就需要綜合考慮
題目一:一共有n個人,人的體重是w[i],船的上線重量是c,每條船最多是兩個人,問最少幾條船能把所有人裝走
我們先將w(i)從小到大排序走一遍,當1是最輕的時候,他加2的重量還是比c大,那麼說明至少有n條船,因為兩個最輕的人都不能同船,那其他人就跟不可能在一起坐船了
然後我們的思路走到第i和第k個人同船,如果存在j比k重,但是j和i又同船不超載,那麼我們就應該讓i和j一起坐船,這就是當前區域性的最優解
所以我們來回憶一下這題的解法,利用雙指標,i從最輕的開始走,j從最重的往回走,j先走,當j和最輕的都做不了船的時候,就說明此時的j需要乙個人坐船,j一直遞減到第乙個能和i坐船的情況,才會出現i+1的同時,j-1並且只多一條船的情況,之後就繼續往下走就完事。
後續
總結:
這裡的貪心思路就是從最輕的開始找,每次找都是找能同船的最大的重量,到最後結果的時候就會轉化成最少需要幾條船
題目二:區間問題,一條數軸上面有n個開區間(a(i),b(i)),選擇盡可能多的點使得區間之間沒有公共點
最多區間問題我們會考慮的多一點的就是,區間越小,有公共點的機率就越低,所以我們需要先按照b(i)的大小來遞增排序,現在假設區間已經按照b(i)的大小排序好了(選左邊界或者右邊界都可以,具體就是判斷當乙個邊界排序之後,另乙個邊界的相交問題),那麼下面我們來考慮左邊界的問題
我們拿到第乙個區間之後,排除所有和區域一相交的區域,從下乙個和區域一不相交的區域開始,重複剛才的操作繼續確定下乙個區域,最後掃瞄整個數軸就能完成貪心,得到最終的結果
後續
總結:
這裡的貪心思路就是在每個不相交的區間內選乙個最大的區間,當每次選擇不相交最小的區間的時候就會得到最多的區間個數
題目三:區間選點問題:一條數軸,n個閉區間[a(i),b(i)],取盡量少的點使得每乙個區間都至少包含乙個點
假如區間i有點,那麼所有包括區間i的區間都被滿足。
還是先對所有的區間按照b(i)大小進行增序,當b(i)相同的時候,a(i)進行遞減排序(這樣如果碰到相同的我們直接計b(i)相同a(i)最大的一次就好了)
接下來每次去找的時候就去找最小的區間,然後每次取點就是最小區間的最右點,把所有的有交集的區間都去除掉之後再去尋找下乙個最小的區間,重複當前過程
總結:這裡的貪心思路就是獲取每乙個最小的區間來獲得點,每次獲得最小區間之後把右邊所有相交的區間都刪除,這樣重複的操作
後續
題目四:交代任務,有n個部下,每個部下有乙個任務,交代任務的時間為b[i]執行任務的時間為j[i],不能同時對兩個部下交代任務,但是兩個任務可以同時執行,選擇交代順序使得所有的任務盡快完成
按照直覺來說,執行時間越長的越應該放在前面,當然只靠直接還是不准的,下面舉個簡單的栗子來證明一下
後續
題目五:酒交易,一條直線上有n(2<=n<=100000)個等距村莊,要麼買酒要麼賣酒,第i個村莊需求為ai,ai<0需要買酒,ai>0需要**酒,所有ai相加等於0,k個單位的酒從乙個村莊到相鄰的村莊要求是k的勞動力,最少要求多少勞動力
從最左便開始考慮,如果a1大於0,說明肯定有酒從2號村莊到一號村莊去,勞動力就是k,那麼我們現在假設有四個村莊,不難看出其實最後的勞動力就等於每個相鄰的村莊相加最後得出的結果
後續
E 最小新整數(貪心學習)
給定乙個十進位制正整數n 0 n 1000000000 每個數字上數字均不為0。n的位數為m。現在從m位中刪除k位 0 input 第一行t,表示有t組資料 接下來t行,每一行表示一組測試資料,每組測試資料報含兩個數字n,k。output t行,每行乙個數字,表示從n中刪除k位後得到的最小整數。sa...
學習記錄2 貪心
定義 通過逐步求區域性最優 當前狀態的最好選擇 來匯出全域性最優 ps 允許的條件下貪心最快 適用條件 具有最優子結構 乙個問題的最優解包含其子問題的最優解,乙個問題的最優解包含其子問題的最優解 具有貪心選擇性質 求問題的整體最優解可以通過一系列區域性最優的選擇,即貪心選擇來達到。流程 greedy...
註冊中心學習
功能 服務發現 服務配置 健康檢測 zookeeper是基於cp來設計的,即任何時刻對zookeeper的訪問請求能得到一致的資料結果,同時系統對網路分割具備容錯性,但是它不能保證每次服務請求的可用性。eureka時遵守的就是ap原則 在大多數分布式環境中,尤其是涉及到資料儲存的場景,資料一致性應該...