title: 3.最优合并问题
date: 2023-05-05 16:31:19
categories:
- 大学课程内容
- 大二下
- 算法分析基础
3.最优合并问题
【问题描述】
给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少。
【输入形式】
序列数目,以及各个序列中的元素数目。
【输出形式】
最少的总比较次数
【样例输入】
4
5 12 11 2
【样例输出】
52
思路
贪心的思想:使用一个优先队列,每次从队列中取出两个最小的序列进行合并,再将得到的结果插入到优先队列中去。
代码
import heapq
n = int(input())
ls = [int(x) for x in input().split(' ')]
priority_queue = []
for i in ls: heapq.heappush(priority_queue, i)
res = 0
while len(priority_queue) > 1:
a = heapq.heappop(priority_queue)
b = heapq.heappop(priority_queue)
res += a + b - 1
heapq.heappush(priority_queue, a + b)
print(res)