#include<iostream>
#include<queue>
#include<fstream>
using namespace std;
int findMin(int a[], int k){
priority_queue<int, vector<int>, greater<int> > q; //升序队列,小顶堆
for(int i = 0; i < k; i++)
q.push(a[i]);
int sum = 0;
while(q.size() >= 2){
//每次取出长度最短的两个序列进行合并
int x = q.top();
q.pop();
int y = q.top();
q.pop();
sum += x + y - 1; //比较次数累加
q.push(x + y); //将合并后新生成的序列的长度放入堆中
}
return sum;
}
int findMax(int a[], int k){
priority_queue<int> q; //降序队列,大顶堆
for(int i = 0; i < k; i++)
q.push(a[i]);
int sum = 0;
while(q.size() >= 2){
//每次取出长度最长的两个序列进行合并
int x = q.top();
q.pop();
int y = q.top();
q.pop();
sum += x + y - 1; //比较次数累加
q.push(x + y); //将合并后新生成的序列的长度放入堆中
}
return sum;
}
int main(){
ifstream infile("input.txt");
int n;
infile >> n;
int a[n+1];
for(int i = 0; i < n; i++)
infile >> a[i];
infile.close();
ofstream outfile("output.txt");
outfile << findMax(a, n) << " " << findMin(a, n) << endl;
outfile.close();
return 0;
}
算法六组