poj3253 優先佇列

2022-03-12 13:19:28 字數 1152 閱讀 2397

解題思路:**:  分析得非常好!!

利用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塊,但是每切一刀需要收費。收費的方法是 網上有一些人理解有誤 每當在一塊木板上動刀子,這塊木板的原有長度代表了這刀的費用。思路 切割的過程可以用一棵二叉樹表示,每個節點有兩個或者沒有子節點,節點儲存切割過程中每塊木板的長度。父節點的值 兩個子節點相加 根節點是...