首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

POJ 3253 Fence Repair:哈夫曼树 / 优先队列合并木板

     編輯:關於C++

题目大意

N 块木板(N≤20000),长度 L_i。每次合并两块,代价为长度和。求合并成一块的最小总代价。

哈夫曼贪心

每次取最小两块合并,放回队列。用最小堆(优先队列)实现。

C++ 实现

#include 
#include 
#include 
using namespace std;

int main() {
    int N;
    while (scanf("%d", &N) == 1) {
        priority_queue, greater> pq;
        for (int i=0;i 1) {
            int a = pq.top(); pq.pop();
            int b = pq.top(); pq.pop();
            ans += a + b;
            pq.push(a + b);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

复杂度

  • 时间:O(N log N)
  • 空间:O(N)

经典应用

  • 哈夫曼编码构建最优前缀码
  • 最优合并模式(文件合并、石子合并)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved