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+" ");
	}
}
                    
                
                
            
        
浙公网安备 33010602011771号