首页 新闻 赞助 找找看

最优合并问题

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];

}
return sum;

}
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;
}

施安琪的主页 施安琪 | 菜鸟二级 | 园豆:202
提问于:2019-11-04 19:43
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册