南邮 OJ 1250 最优合并问题

来源:互联网 发布:抓鬼软件 编辑:程序博客网 时间:2024/05/16 06:07

最优合并问题

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 46            测试通过 : 28 

比赛描述

给定个排好序的序列s1 s2 , ….sk 路合并算法将这个序列合并成一个序列。假设所采用的路合并算法合并个长度分别为mn的序列需要-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。

为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。

对于给定的k个待合并序列,编程计算最多比较次数和最少比较次数合并方案。



输入

第一行有个正整数k,表示有k个待合并序列。接下来的行中,有k个正整数,表示k个待合并序列的长度。

输出

将编程计算出的最多比较次数和最少比较次数输出

样例输入

4
5 12 11 2

样例输出

78 52

提示

undefined

题目来源

NUAA





#include<iostream>#include<set>using namespace std;int main(){int k,a,minCost,maxCost;;multiset<int> iSet1, iSet2;multiset<int>::iterator it;multiset<int>::reverse_iterator rIt;cin>>k;while(k--){cin>>a;iSet1.insert(a);iSet2.insert(a);}minCost = 0;while(iSet1.size()>=2){it = iSet1.begin();a = *it;iSet1.erase(it);it = iSet1.begin();a += *it;iSet1.erase(it);minCost += a-1;iSet1.insert(a);}maxCost = 0;while(iSet2.size()>=2){rIt = iSet2.rbegin();a = *rIt;iSet2.erase((++rIt).base());rIt = iSet2.rbegin();a += *rIt;iSet2.erase((++rIt).base());maxCost += a-1;iSet2.insert(a);}cout<<maxCost<<' '<<minCost<<endl;}


0 0