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

2023-05-25 14:01:56 浏览数 (1)

最优合并问题 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;
}

0 人点赞