解題思路:**: 分析得非常好!!
利用huffman思想,要使總費用最小,那麼每次只選取最小長度的兩塊木板相加,再把這些「和」累加到總費用中即可
本題雖然利用了huffman思想,但是直接用huffmantree做會超時,可以用優先佇列做
因為樸素的huffmantree思想是:
(1)先把輸入的所有元素公升序排序,再選取最小的兩個元素,把他們的和值累加到總費用
(2)把這兩個最小元素出隊,他們的和值入隊,重新排列所有元素,重複(1),直至佇列中元素個數<=1,則累計的費用就是最小費用
huffmantree超時的原因是每次都要重新排序,極度浪費時間,即使是用快排。
乙個優化的處理是:
(1)只在輸入全部資料後,進行一次公升序排序(以後不再排序)
(2)佇列指標p指向佇列第1個元素,然後取出隊首的前2個元素,把他們的和值累計到總費用,再把和值sum作為乙個新元素插入到佇列適當的位置
由於原隊首的前2個元素已被取出,因此這兩個位置被廢棄,我們可以在插入操作時,利用後乙個元素位置,先把佇列指標p+1,使他指向第2個廢棄元素的位置,然後把sum從第3個位置開始向後逐一與各個元素比較,若大於該元素,則該元素前移一位,否則sum插入當前正在比較元素(佇列中大於等於sum的第乙個元素)的前乙個位置
(3)以當前p的位置作為新佇列的隊首,重複上述操作
#include #include#include
using
namespace
std;
__int64 sum,mincost;
int cmp(const
void* a,const
void *b)
intmain()
qsort(w,n,
sizeof
(__int64),cmp);
mincost=0
;
for(i=0; i1; i++)
else
}if(j==n) w[n-1]=sum; //
當大於所有的值,填充在最後
} printf(
"%i64d\n
",mincost);
return0;
}
poj 3253 哈夫曼思想 優先佇列實現
這兩天都沒怎麼寫 因為數學拉的太多了。期中考來了。今天看了一篇文章,又想起這題,就跑來看看,發現之前居然並沒有寫題解。思路,每個木板的開銷應該是木板的長度乘以節點的深度。那麼就是最短的板應該是深度最大的節點之一,每次將最短的和次短的合併起來就是當前最小的開銷,一直加起來直到所有木板最後合併成乙個木板...
poj3253 貪心選擇
por3242 fence repair 題目大意 給定乙個木條,鋸成指定要求的長度,每鋸一次花費是被鋸成的兩段長度之和。求最小的花費。解題思路 將小木條合併成乙個大木條,貪心。每次都選取最小的長度合併。求最小的時候用優先佇列。include include include include prag...
poj 3253哈夫曼樹
題目的意思是。要把一塊木板切成所需要的n塊,但是每切一刀需要收費。收費的方法是 網上有一些人理解有誤 每當在一塊木板上動刀子,這塊木板的原有長度代表了這刀的費用。思路 切割的過程可以用一棵二叉樹表示,每個節點有兩個或者沒有子節點,節點儲存切割過程中每塊木板的長度。父節點的值 兩個子節點相加 根節點是...