題目來源:王曉東《算法設計與分析》
給定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+" ");
}
}