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 }