题目描述
给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。
假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。
试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少。
输入
输入一个正整数n (0 < n < 1000)表示序列的个数
接下来n个正整数表示每个序列元素的个数ai (0<ai<10^9)
输出
输出合并次数的最优和最差的比较次数
样例输入
4 5 12 11 2
样例输出
52 78
贪心算法
代码如下
#include<iostream>
#include <algorithm>
using namespace std;
long long a[1000000],b[1000000];
int main(){
int n;
long long sum;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(a,a+n);
sum=0;
for(int i=0;i<n-1;i++){
a[i+1]=a[i]+a[i+1];
sum=sum+a[i+1];
sort(a+i+1,a+n);
}
sum=sum-(n-1);
printf("%lld\n",sum);
sort(b,b+n);
sum=0;
for(int i=n-1;i>0;i--){
b[i-1]=b[i]+b[i-1];
sum=sum+b[i-1];
sort(b,b+i);
}
sum=sum-(n-1);
printf("%lld",sum);
return 0;
}