有一根長度為 L 的木板,需切成 n 塊指定長度。每次切割成本等於當前木板長度。求最小總成本。
逆向思考:切割過程構成一棵二叉樹,葉子為目標木板,內部節點為合併後的木板。總成本 = Σ(葉子長度 × 深度)。為最小化總成本,最短木板應對應最深節點 → **每次合併最短的兩塊木板**(霍夫曼編碼原理)。
l1, l2,成本累加 l1+l2,將 l1+l2 放回堆。#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
typedef long long LL;
const int N = 20000 + 10;
int d[N];
int n;
LL ans;
void solve() {
priority_queue<int, vector<int>, greater<int>> q;
for (int i = 0; i < n; i++) q.push(d[i]);
while (q.size() > 1) {
int l1 = q.top(); q.pop();
int l2 = q.top(); q.pop();
ans += l1 + l2;
q.push(l1 + l2);
}
printf("%lld\n", ans);
}
int main() {
while (~scanf("%d", &n)) {
for (int i = 0; i < n; i++) cin >> d[i];
ans = 0;
solve();
}
return 0;
}
greater<int> 實現最小堆(默認最大堆)。long long 存儲答案。霍夫曼編碼、最優合併模式、遊戲開發中資源合成成本優化等。