• 1743最优合并问题(贪心)


    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
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <string.h>
     4 #include <vector>
     5 #include <queue>
     6 
     7 #define inf 0x3f3f3f3f
     8 
     9 using namespace std;
    10 
    11 priority_queue<int, vector<int>, greater<int> > q1;
    12 priority_queue<int, vector<int>, less<int> > q2;
    13 
    14 int main()
    15 {
    16     int n, x, i, sum, sum1, sum2;
    17     cin >> n;
    18     for(i=0; i<n; i++)
    19     {
    20         cin >> x;
    21         q1.push(x);
    22         q2.push(x);
    23     }
    24     sum1 = 0;
    25     while(q1.size()!=1)
    26     {
    27         sum = 0;
    28         for(i=0;i<2;i++)
    29         {
    30             sum += q1.top();
    31             q1.pop();
    32         }
    33         q1.push(sum);
    34         sum--;
    35         sum1 += sum;
    36     }
    37     sum2 = 0;
    38     while(q2.size()!=1)
    39     {
    40         sum = 0;
    41         for(i=0;i<2;i++)
    42         {
    43             sum += q2.top();
    44             q2.pop();
    45         }
    46         q2.push(sum);
    47         sum--;
    48         sum2 += sum;
    49     }
    50     cout << sum2 << " " << sum1 << endl;
    51     return 0;
    52 }
  • 相关阅读:
    网络通信
    jvm调优
    rokectMq
    mybatis属性类
    spring cloud feign
    spring cloud hystrix
    spring cloud ribbon
    mybatis(二)创建代理类执行sql
    内存操作函数
    堆空间的开辟与使用
  • 原文地址:https://www.cnblogs.com/0xiaoyu/p/14096403.html
Copyright © 2020-2023  润新知