zoukankan      html  css  js  c++  java
  • 贪心[2019.5.25]

    题目:

      给定k个排好序的序列s1,s2,...,sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并2个长度为m和n的序列需要m+n-1次比较。设计一个算法确定2路合并次序,使所需的总比较次数最少。

      输入:

      第一行有 个正整数k,表示有k个待合并序列。接下来的行中,有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

     

  • 相关阅读:
    linux shell在while中用read从键盘输入
    ubuntu14.04折腾迅雷xware
    select与epoll分析
    ubuntu 14.04下练习lua
    C++中的重载、覆盖、隐藏
    删除ubuntu旧内核
    fcntl函数加文件锁
    系统中断与SA_RESTART
    linux使用共享内存通信的进程同步退出问题
    leetcode-easy-others-268 Missing Number
  • 原文地址:https://www.cnblogs.com/cruelty_angel/p/11021830.html
Copyright © 2011-2022 走看看