绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
优合并问题
2019-11-05 09:54:24

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

给定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;

}

分享好友

分享这个小栈给你的朋友们,一起进步吧。

长沙IT圈
创建时间:2019-10-25 09:32:10
结识长沙IT圈朋友、一起打酱油。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • abc
    栈主

小栈成员

查看更多
  • 栈栈
  • 54xx
  • amadan
  • abcjob
戳我,来吐槽~