1743最优合并问题(贪心)

Description

给定k 个排好序的序列s1 , s2,……, sk , 用2 路合并算法将这k 个序列合并成一个序列。假设所采用的2 路合并算法合并2 个长度分别为m和n的序列需要m + n -1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。
为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
对于给定的k个待合并序列,计算最多比较次数和最少比较次数合并方案。
 

Input

输入数据的第一行有1 个正整数k(k≤1000),表示有k个待合并序列。接下来的1 行中,有k个正整数,表示k个待合并序列的长度。

Output

输出两个整数,中间用空格隔开,表示计算出的最多比较次数和最少比较次数。

Sample

Input 

4
5 12 11 2

Output 

78 52
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <vector>
 5 #include <queue>
 6 
 7 #define inf 0x3f3f3f3f
 8 
 9 using namespace std;
10 
11 priority_queue<int, vector<int>, greater<int> > q1;
12 priority_queue<int, vector<int>, less<int> > q2;
13 
14 int main()
15 {
16     int n, x, i, sum, sum1, sum2;
17     cin >> n;
18     for(i=0; i<n; i++)
19     {
20         cin >> x;
21         q1.push(x);
22         q2.push(x);
23     }
24     sum1 = 0;
25     while(q1.size()!=1)
26     {
27         sum = 0;
28         for(i=0;i<2;i++)
29         {
30             sum += q1.top();
31             q1.pop();
32         }
33         q1.push(sum);
34         sum--;
35         sum1 += sum;
36     }
37     sum2 = 0;
38     while(q2.size()!=1)
39     {
40         sum = 0;
41         for(i=0;i<2;i++)
42         {
43             sum += q2.top();
44             q2.pop();
45         }
46         q2.push(sum);
47         sum--;
48         sum2 += sum;
49     }
50     cout << sum2 << " " << sum1 << endl;
51     return 0;
52 }
原文地址:https://www.cnblogs.com/0xiaoyu/p/14096403.html