ITPub博客

首页 > > > 最优合并问题

最优合并问题

作者:deeply 时间:2019-11-05 09:54:24 0 删除 编辑

题目来源:王晓东《算法设计与分析》

给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。

想知道为什么第二个测试点过不了。

include<iostream>

include<algorithm>

using namespace std;

int k;

int l[100];

bool cmp(const int a, const int b) {

return a > b;

}

int Bad() {

int sum = 0;

int m[100];

for (int i = 0; i < k; i++) {

m[i] = l[i];

}

for (int i = 0; i < k - 1; i++) {

sum += m[i] + m[i + 1] - 1;

m[i + 1] = m[i] + m[i + 1];

}returnsum;

}

int Good() {

int sum = 0;

int m[100];

for (int i = 0; i < k; i++) {

m[i] = l[i];

}

int newk = k;

for (int i = 0; i < k - 1; i++) {

sort(m, m + newk);

sum += m[0] + m[1] - 1;

m[0] = m[0] + m[1];

m[1] = m[newk - 1];

newk--;

}

return sum;

}

int main() {

cin >> k;

for (int i = 0; i < k; i++) {

cin >> l[i];

}

sort(l, l + k, cmp);

cout << Bad();

cout << " ";

sort(l, l + k);

cout << Good();

return 0;

}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1978/viewspace-3169323/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-30

  • 博文量
    215
  • 访问量
    24533