最优合并问题
来源:互联网 发布:中国微软程序员工资 编辑:程序博客网 时间:2024/06/07 03:32
最优合并问题
给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少。
测试用例:
4(序列数)
5 1211 2(序列中的元素数)
输出:
78(最差情况)
52(最优情况)
解:
最优合并问题:
当取最小值保证每次的2个加数为最小便可,最大值同理取当前最大的两个值便可
请看下面序列
3,6,5,12,7
如果排好序之后依次按照,找最小连个数进行相加
排好序之后3,5,6,7,12
最小值3+5 = 8 8,6,7,12 按照排序的思路此时不能保证当前数组中前两位是最小值,所以还要排序
6,7,8,12 6+7 = 13 -->13,8,12
继续排序
最后按照题意m和n的序列需要m+n-1 次比较
所以在比较中每次减一。
这样便求出了最小值
#include <stdio.h>#include <algorithm>using namespace std;int n;int cmp(int a,int b){return a>b;}int minsum(int a[],int m){int b[n];int sum=0;for(int i=0;i<n;i++){b[i]=a[i];}while(m>1){sort(b,b+m);b[0]=b[0]+b[1];sum+=b[0];for(int i=1;i<m-1;i++){b[i]=b[i+1];}m--;}return sum-n+1;} int maxsum(int a[],int m){int b[n];int sum=0;for(int i=0;i<n;i++){b[i]=a[i];}while(m>1){sort(b,b+m,cmp);b[0]=b[0]+b[1];sum+=b[0];for(int i=1;i<m-1;i++){b[i]=b[i+1];}m--;}return sum-n+1;} int main(){int a[100];scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}printf("min:%d\n",minsum(a,n));printf("max:%d\n",maxsum(a,n));}
0 0
- 最优合并问题
- 最优合并问题
- 算法 最优合并问题
- 最优合并问题
- 最优合并问题
- 最优合并问题
- 最优合并问题
- 最优合并问题
- 【贪心】最优合并问题
- 南邮 OJ 1250 最优合并问题
- 算法笔记 //08_最优合并问题
- 最优车皮排序问题
- 最优服务次序问题
- 水处理最优方案问题
- 【dp】最优时间表问题
- 多处最优问题
- 最优程序问题
- 最优流水调度问题
- JavaScript执行环境及作用域
- C-C++面试题2
- 63 leetcode - Unique Paths
- zabbix 临时关闭报警
- Thrift 服务器端的几种工作模式分析
- 最优合并问题
- JavaScript数据转换三——parseInt与parseFloat的区别及判别方式
- [欧拉回路] Codeforces 429E #245 (Div. 1) E. Points and Segments
- 地图定位技术
- 数独问题
- EOJ 1809 询问
- 64 leetcode - Unique Paths II
- javascript-深入浅出-类型检测
- Swift3.0 GCD多线程详解