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+" ");
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM