PTA習題解析 修理牧場 2 種解法

2022-03-08 22:55:07 字數 3018 閱讀 3996

禁止碼迷,布布扣,豌豆**,碼農教程,愛碼網等第三方爬蟲**爬取!

目錄哈夫曼樹

優先順序佇列(非 stl 庫)

延伸閱讀

49
我們如果按照分割木塊的思想去分析,會顯得很不直觀,所以我們直接通過我們的目標來組合出最花費的情況,那麼這就很顯然要使用貪心演算法來解決。如圖所示用圓形來表示小木塊。

要保證花費更小,就需要讓較短的木塊後生成,較長的木塊先生成,因此我選擇較小的兩個木塊,還原為它們被分割出來之前的狀態。即選擇兩個長度為 1 的木塊,組合成乙個長度為 2 的木塊。

接下來我要去生成下乙個木塊,選擇兩個目前最短的木塊,還是兩個 1 長度的木塊,組合成長度為 2 的木塊。

重複上述操作。

模擬完畢,觀察一下我們發現,我們已經還原出了木塊的每一次應該如何切割,由於木塊切割費用與其長度相等,因此我們把黃色源泉的數字都加起來,發現正好是 49。此時我可以說,問題已經解決了,我們把目標木塊當成乙個個結點,長度當做權,這道題不就是要建一棵哈夫曼樹嘛。

將上述函式封裝好,並新增讀取資料的**即可實現。

#includeusing namespace std;

typedef struct htnode, * huffmantree;

void creathuffmantree(huffmantree& ht, int n); //建哈夫曼樹

void select(huffmantree ht, int k, int &idx1, int &idx2); //找孩子結點

int main()

cout << sum;

}void creathuffmantree(huffmantree& ht, int n)

for (i = 1; i <= n; i++)

cin >> ht[i].weight; //輸入各個結點的權值

//建哈夫曼樹

for (i = n + 1; i <= m; i++)

}void select(huffmantree ht, int k, int& idx1, int& idx2)

min1 = ht[i].weight;

idx1 = i;

}else if (ht[i].parent == 0 && min2 > ht[i].weight)}}

為了使費用最省,我們使用貪心演算法的思想,每一次選擇最小的兩段木頭拼回去,直到將所有木頭拼成一段完整的木頭,每次一拼接都計算一次費用。我們發現,優先順序佇列也是可以實現貪心演算法的。

我們首先需要先把這個佇列修改成小頂堆,方便我們實現優先順序佇列。

接下來令兩個元素出佇列,計算一次費用,然後將兩個元素之和的數字入佇列。

重複上述操作,使的佇列只剩乙個元素。

在這裡我們可以看出優先順序佇列是可以解決問題的,此時的問題是我該怎麼控制堆中的資料元素個數?通過觀察,每一次是出堆 2 個元素,入堆 1 個元素,也就是說每次的淨出堆元素是 1 個,那麼就在堆中元素為 1 時結束這個流程就行了。

接下來就是如何調整堆的問題了,比較粗暴的方式是每次更改之後都建初堆,但是這樣效率和哈夫曼樹差不多,優化不是很明顯。根據我們剛剛的分析,既然有 2 次出堆,那麼在出堆之後保證剩下的元素也是堆就可以了,那麼只需要 2 次調整堆。比較方便的操作是第一次出堆時,拿堆的最後乙個元素到堆頂調整堆,第二次出堆時直接把入堆元素填充到堆頂調整堆。

#includeusing namespace std;

void heapify(int a_heap, int idx1, int idx2);

void creatheap(int a_heap, int n);

int main()

creatheap(a_heap, count); //建初堆

while (count != 1)

cout << money;

return 0;

}void heapify(int a_heap, int idx1, int idx2) //調整堆,細節見上文

if (insert_node <= a_heap[i])

a_heap[idx1] = a_heap[i];

idx1 = i;

}a_heap[idx1] = insert_node;

}void creatheap(int a_heap, int n) //建初堆,細節見上文

}

哈夫曼樹與哈夫曼編碼

堆、優先順序佇列和堆排序

pta 修理牧場

農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l i個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是l i的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成...

PTA 資料結構 修理牧場

7 8 修理牧場 25 分 農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l i 個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是l i 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度...

PTA 7 10 修理牧場 25 分

農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l 個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是l 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成長度...