農民 john 希望修復圍繞農場的一小段圍欄。他測量了一下,發現需要 n (1 <= n<= 20,000)根木頭,每根都有某乙個整數長度 li (1 <= li <= 50,000) 單位長度。他買了一根很長的很長的木頭,正好能夠鋸出他所需要的 n 根木頭。(即它的長度正好等於 li 的總和) fj 忽略鋸口,鋸掉的木屑產生的長度損失忽略不計,你也可以忽略它。fj 遺憾的發現他自己沒有用於切木頭的鋸子,所以他就帶著那根很長的木頭來到了農民don 的農場,想問他借乙個鋸子。農民 don 是乙個保守的資本家,他不願意借鋸子給 fj ,但願意自己來切這 n-1 刀,每一次都向 fj 收取費用。每次的收費正好等於你要鋸的那根木頭的總長度。例如,你要鋸一根長度為 21 的木頭,就花費 21 分錢。農民 don 然後讓農民 john 自己決定每次鋸木頭的順序和位置。幫助農民 john 確定鋸出這 n 根木頭的最小總花費。 fj 知道可以有很多種不同的切割方式,不同的方式可能得到不同的總花費,這是因為木頭在鋸的過程中的長度不一。
* line 1: 乙個整數 n,表示要鋸出的木頭數
* lines 2..n+1: 每行乙個整數,表示每根木頭的長度。
* line 1: 乙個整數,表示他最少需要多少分錢,鋸 n-1 下,鋸出所有需要的木頭。
385
8
34
圖論-樹
圖論哈夫曼樹(huffman tree),又名最優樹,指給定n個權值作為n的葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。若將樹中結點賦給乙個有著某種含義的數值,則這個數值稱為該結點的權。
本題目可以轉化為huffman樹構造問題:
1.每次找出兩塊長度最短的木板,然後把它們合併,加入到集合中,
2.在集合中找出兩塊長度最短的木板,合併,並把合併的長度加入到集合中,重複過程,直到集合中只剩下乙個元素
顯然,通過每次選取兩塊長度最短的木板合併,最終必定可以合併出長度為l的木板,並且可以保證總的耗費最少。
#include
#include
#include
#include
using namespace std;
int main()
printf("%lld\n",sum);
}return 0;
}參考部落格:
騎馬修柵欄
對剛學的尤拉迴路的練習。錯點 萬一是尤拉路徑不是尤拉迴路的話,不能只選乙個最小的點當起點。要選度數為奇數的兩個點中較小的乙個。2.1 不一定在連通圖內,不能單純的把 1 當做起點。3.見 中的注釋。include include include includeusing namespace std ...
騎馬修柵欄題解
最近在luogu做了一道叫烏鴉坐飛機騎馬修柵欄的題。farmer john每年有很多柵欄要修理。他總是騎著馬穿過每乙個柵欄並修復它破損的地方。john是乙個與其他農民一樣懶的人。他討厭騎馬,因此從來不兩次經過乙個柵欄。你必須編乙個程式,讀入柵欄網路的描述,並計算出一條修柵欄的路徑,使每個柵欄都恰好被...
騎馬修柵欄 Riding the Fences
可以按正常的輸入然後存入map陣列 ps 如果你用的是萬能頭就不要定義map陣列啦,可以定義乙個f陣列什麼的 這裡就出現和一本通上一筆畫的差距了,是累減,每次記錄就加一而不是賦值為1 因為後面很多地方需要用到點的個數,但是卻沒有輸入所以專門定義乙個maxn來找輸入的最大值就是點的個數啦 includ...