7-13 最优合并问题
题目来源:王晓东《算法设计与分析》
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
输入格式:
第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。
输出格式:
输出最多比较次数和最少比较次数。
输入样例:
在这里给出一组输入。例如:
4
5 12 11 2
输出样例:
在这里给出相应的输出。例如:
78 52
//因为合并长度为m,n的序列需要比较m+n-1此,所以最小比较此数就是m,n取最小值,就是每次将合并之后插入在排序,然后取出两个最小值在相加在插入排序,就是一个插入,排序的过程,
a[i] = a[i-1]+a[i]//每次将i和i-1位置上的数相加赋给i,在对i到n-1排序,就可以求的问题的解
import java.util.Arrays;
import java.util.Scanner;
public class BestCombine {
public static int n;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
int a[] = new int[n];
int b[] = new int[n];
for(int i=0;i<n;i++){
b[i] = a[i] = in.nextInt();
}
maxCombine(a);
minCombine(b);
}
//求最少合并此数
public static void minCombine(int a[]){
Arrays.sort(a);
int total = 0;
for(int i=1;i<n;i++){
a[i] = a[i-1]+a[i];
total+=(a[i]-1);
Arrays.sort(a, i, a.length);
}
System.out.print(total);
}
//求最大合并此数
public static void maxCombine(int a[]){
int total=0;
Arrays.sort(a);
for(int i=n-2;i>=0;i--){
a[i] = a[i]+a[i+1];
total+=(a[i]-1);
Arrays.sort(a,0,i+1);
}
System.out.print(total+" ");
}
}