前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最优合并问题------贪心思想

最优合并问题------贪心思想

作者头像
来杯Sherry
发布2023-05-25 14:01:56
3490
发布2023-05-25 14:01:56
举报
文章被收录于专栏:第一专栏第一专栏

最优合并问题 Description 给定k 个排好序的序列s1 , s2,……, sk , 用2 路合并算法将这k 个序列合并成一个序列。假设所采用的2 路合并算法合并2 个长度分别为m和n的序列需要m + n -1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。 对于给定的k个待合并序列,计算最多比较次数和最少比较次数合并方案。

Input 输入数据的第一行有1 个正整数k(k≤1000),表示有k个待合并序列。接下来的1 行中,有k个正整数,表示k个待合并序列的长度。 Output 输出两个整数,中间用空格隔开,表示计算出的最多比较次数和最少比较次数。 Sample Input 4 5 12 11 2 Output 78 52 AC代码:

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
int main()
{
    priority_queue<int,vector<int>,greater<int> >q1;
    priority_queue<int>q2;
    int n;
    cin>>n;
    for(int i =0; i<n; i++)
    {
        int x;
        cin>>x;
        q1.push(x);
        q2.push(x);
    }
    long long sum_mi =0,sum_ma =0;
    while(q1.size()>1)
    {

        int a =q1.top();
        q1.pop();
        int b =q1.top();
        q1.pop();
        sum_mi +=a+b-1;
        q1.push(a+b);

    }

    while(q2.size()>1)
    {

        int a =q2.top();
        q2.pop();
        int b =q2.top();
        q2.pop();
        sum_ma +=a+b-1;
        q2.push(a+b);

    }
    cout<<sum_ma<<" "<<sum_mi<<endl;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档