題目:
a城市有乙個巨大的圓形廣場,為了綠化環境和淨化空氣,市**決定沿圓形廣場外圈種一圈樹。園林部門得到指令後,初步規劃出n個種樹的位置,順時針編號1到n。並且每個位置都有乙個美觀度ai,如果在這裡種樹就可以得到這ai的美觀度。但由於a城市土壤肥力欠佳,兩棵樹決不能種在相鄰的位置(i號位置和i+1號位置叫相鄰位置。值得注意的是1號和n號也算相鄰位置!)。
最終市**給園林部門提供了m棵樹苗並要求全部種上,請你幫忙設計種樹方案使得美觀度總和最大。如果無法將m棵樹苗全部種上,給出無解資訊。
分析:
首先考慮如果沒有「相鄰位置不能都種」這一限制會怎麼樣。這時就是乙個裸的貪心——按照a[i]從大到小排序,然後取前m個。
那麼加上限制以後會發生什麼呢?
假設a[3]最大,那我們就試圖去選a[3]。選中之後首先要去掉3,並且,a[2]和a[4]也都不能選了,所以將它們刪掉——
但是慢著!這可能會導致問題。假設a[3]=20,a[2]=a[4]=19,那麼同時選a[2],a[4]可能比選a[3]要優!在最後的方案中可能是a[2]+a[4]而非a[3]。這種情況要怎麼解決呢?
可以發現一點:由於a[3]最大,所以在最後的方案中,不可能只選a[2],a[4]中的乙個。
原因很簡單:假設在最優方案中選了a[2]但未選a[4],那可以簡單地把a[2]換成a[3],由於未選a[4],所以這樣不會產生任何矛盾,並且把a[2]換成a[3]後,總的美觀度不會下降。
因此,我們先去掉2,3,4,然後加入乙個新的「物品」,其權值為a[2]+a[4]-a[3],代表同時選2,4,刪去3.這樣,在選了3之後再選這個新物品,功效就相當於剛才所說的,把a[3]換成a[2]+a[4]。
這個新物品應該放在**呢?它的含義是「選2,4」,所以很容易想到,應該把它放在1,5中間。
出於方便起見,不妨在刪掉2,4後直接把a[3]改成a[2]+a[4]-a[3],顯然這個位置是正確的。
如此就將n個物品,需要選m個的問題轉化成了在n-1個物品中選的問題。並且可以發現乙個很好的性質:新的3所對應的仍然是「選中物品數+1」!(把選3換成了選2,4,即多選了乙個物品)
也就是說,完全可以把新的3看做乙個和1,5毫無區別的物品,現在我們只需要在1,3,5三個物品中選擇m-1個!如此下去,直到選擇m次,就可以得到答案。
因此描述一下演算法:以a[i]為關鍵字建大根堆,用乙個鍊錶存放當前物品。
最初鍊錶中元素是1~n,i的後繼是i+1,前驅是i-1(當然,1的前驅是n,n的後繼是1)。
執行m次操作,每一次操作都將堆頂元素k取出,ans+=a[k]。然後在鍊錶中刪除k的前驅pre和後繼nxt,令a[k]=a[pre]+a[nxt]-a[k],並更新堆。
這個演算法執行的很好,但你可能感覺有點虛——為什麼每次選a值最大的就正確呢?
可以發現,在上面的討論中「選3」時,我們實際上做的是宣告如下事實:
在最終答案中要麼選了3,要麼同時選了2,4.換句話說,要麼選了3,要麼在此基礎上選了a[2]+a[4]-a[3]。
所以我們實際上是重寫了這個問題,將其變成「n-2個物品中選m-1」個的形式,如此一直化歸,直到最後變成「n-2(m-1)個物品中選1個」,這時答案就是顯然的。
**:
國家集訓隊2011 種樹 神貪心
莫名其妙就做了集訓隊的題 不過.資料好水 codevs 1342 哈哈哈亂搞85 貪心的 好像有bug2333 照起點和終點 然後dp搞答案 這個應該很簡單的 要滾一下陣列 同桌打的暴力dp 55好像 思路一樣的 就是省去了那個正確性不一定的貪心 include include define max...
P1792 國家集訓隊 種樹
題目描述 a城市有乙個巨大的圓形廣場,為了綠化環境和淨化空氣,市 決定沿圓形廣場外圈種一圈樹。園林部門得到指令後,初步規劃出n個種樹的位置,順時針編號1到n。並且每個位置都有乙個美觀度ai,如果在這裡種樹就可以得到這ai的美觀度。但由於a城市土壤肥力欠佳,兩棵樹決不能種在相鄰的位置 i號位置和i 1...
國家集訓隊2011 公交路線 解題報
題目 z市交通不發達,所有公交路線覆蓋的邊竟然乙個環也不包含,甚至該市的公交路線有可能會分為幾個互不連通的塊,這可真是不可思議。有一天,你突然聽到一條訊息,說你的m個同學被困在了z市裡,他們分別要從他們當前所在的點a i移動到他們想去的點b i.於是你立刻調集資料,了解了z市的形狀和公交路線的分布,...