A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孤影卓尔 中级黑马   /  2014-2-24 16:03  /  966 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

给定k 个排好序的序列s1 , s2 ,... , sk  , 用 2 路合并算法将这k 个序列合并成一个序列。
假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m + n -1次比较。试设
计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。
数据的输入:
由文件input.txt给出输入数据。第一行有1 个正整数k,表示有k个待合并序列。接下
来的1 行中,有k个正整数,表示k个待合并序列的长度。
输入文件示例 输出文件示例
input.txt                                                                         output.txt
4                                                                                   78 52
5 12 11 2

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

2 个回复

倒序浏览
是个贪心算法啊。下面的代码能运行,你导入自己运行下:

  1. import java.util.PriorityQueue;
  2. import java.util.Queue;

  3. class Node implements Comparable<Node> {

  4.     public int number;
  5.    
  6.     public Node(int number) {
  7.         this.number = number;
  8.     }
  9.    
  10.     @Override
  11.     public int compareTo(Node other) {
  12.         // TODO Auto-generated method stub
  13.         if(this.number > other.number)
  14.             return 1;
  15.         else if(this.number < other.number)
  16.             return -1;
  17.         
  18.         return 0;
  19.     }
  20. }

  21. public class Main {

  22.     public static void main(String[] args) {
  23.         
  24.         Queue<Node> queue = new PriorityQueue<Node>();
  25.         queue.add(new Node(5));
  26.         queue.add(new Node(12));
  27.         queue.add(new Node(11));
  28.         queue.add(new Node(2));
  29.         
  30.         while(queue.size() > 1) {
  31.             Node node1 = queue.remove()();
  32.             Node node2 = queue.remove()();
  33.             queue.add(new Node(node1.number + node2.number - 1));
  34.         }
  35.         
  36.         System.out.println(queue.remove()().number);
  37.     }
  38. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
这个问题不是很麻烦,我之前做ACM试题遇到过考察哈夫曼树,这类题目都差不多,直接给你C代码吧!思路:
求最小值:每取2个当前数组中的最小,申请2个变保证每次2个变量中的值值是当前的最小值便可,将2个数合并之后必有一个数取消在数组中的位置,可以将该数改成一个较大的数,将此空间和谐掉,最后按照题意m和n的序列需要m+n-1次比较这样便求出了最小值。
求最大值:将数组从大到小排列,依次相加前两位便可.
#include<stdio.h>
#include<stdlib.h>
void main()
{
    int num,min,max,*arrmax,*arrmin,i,j,a,b,k,temp;
    scanf("%d",&num);
    arrmax=(int *)malloc(num * sizeof(int));
    arrmin=(int *)malloc(num * sizeof (int));
    for(i=0;i<num;i++)
    {
        scanf("%d",&arrmax[i]);
        arrmin[i]=arrmax[i];
    }
    for(min=0,i=0;i<num-1;i++
    {
        a=0,b=1;//数组编号
        for(j=2;j<num;j++)
        {
            if(arrmin[j]<arrmin[a]||arrmin[j]<arrmin[b])
            {
                if(arrmin[a]>arrmin[b])
                    a=j;
                else
                    b=j;
            }
        }
        min+=(arrmin[a]+arrmin[b]);
        arrmin[a]+=arrmin[b];
        arrmin[b]=888888888;
    }
    min-=(num--);
    for(i=0;i<num;i++)
    {
        for(k=i,j=i+1;j<num;j++)
        if(arrmax[k]<arrmax[j])
            k=j;
        temp=arrmax[k];
        arrmax[k]=arrmax[i];
        arrmax[i]=temp;
    }

    for(max=0,i=0;i<num-1;i++)
    {
        max+=(arrmax[i]+arrmax[i++]);
        arrmax[i++]+=arrmax[i];
    }
    max-=(num--);
    printf("%d %d\n",max,min);
}


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马