贪心[2019.5.25]
题目:
给定k个排好序的序列s1,s2,...,sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并2个长度为m和n的序列需要m+n-1次比较。设计一个算法确定2路合并次序,使所需的总比较次数最少。
输入:
第一行有 1 个正整数k,表示有k个待合并序列。接下来的1 行中,有k个正整数,表示k个待合并序列的长度。
输出:
最多比较次数和最少比较次数。
Input:
4
5 12 11 2
Output:
78 56
贪心思想:
找出整体当中每个小的局部的最优解,并且将所有的这些局部最优解合起来形成整体上的一个最优解。
Code:
#include <bits/stdc++.h> 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; }
参考自:https://www.jianshu.com/p/5bb652227dff