第四章实践报告

7-1最优合并问题

1.问题描述:

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

输入格式:第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。

输出格式:输出最多比较次数和最少比较次数。

输入样例:在这里给出一组输入。例如:

4
5 12 11 2

输出样例:在这里给出相应的输出。例如:

78 52

2.贪心策略每次选最小的两个序列合并得到较小比较次数;每次选最大的两个序列合并得到较大的比较次数。两个长度分别为m和n的序列需要m+n-1次比较,此题样例的计算路径为:较小:((2+5-1)+((2+5-1)+11-1))+(2+5+11+12-1)=6+17+29=52较大同理。

3.详细代码及注释
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int k;
    cin>>k;
    int *a = new int[k+1];
    int *b = new int[k+1];//设置两个数组,一个求最大次数,一个求最小次数
    for(int i=0;i<k;i++)
    {
        cin>>a[i];
        b[i] = a[i];
    }
    sort(a,a+k);//库函数,(a,a+k)表示从左到右遍历
    int min=0;
    for(int n=0;n<k-1;n++)//此处循环求最小比较次数
    {
        min =min + a[n] + a[n+1] -1;//最小次数=上次路径最小次数+m+n-1
        a[n] = a[n] + a[n+1];//类似哈弗曼树,a[n]=排序后两个最小次数之和
        a[n+1] = 0;//把其中一个数设置为0
        sort(a,a+k);//调用库函数
    }
    sort(b,b+k);
    int max = 0;
    for(int i=1;i<=k-1;i++)
    {
        max = max +b[k-1]+b[k-2]-1;
        b[k-1]=b[k-1]+b[k-2];
        b[k-2]=0;
        sort(b,b+k);
    }
    cout<<max<<" "<<min<<endl;
    return 0;
}
3.算法时间及空间复杂度当n=1时,就成了m个数的归并排序,时间复杂度为O(mlogn)。4.结对心得这道题是我的同伴打的,他非常细心地向我讲解了此题的方法和策略。最优合并问题帮助我更直观地了解了贪心算法,还有库函数的使用。

原文地址:https://www.cnblogs.com/imweili/p/10019603.html

时间: 2024-11-01 17:55:20

第四章实践报告的相关文章

算法第四章实践报告

1.选择第二题进行分析. 给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数.对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案. 输入 178543 4 输出132.问题描述:就是删掉指定数字中的一些数字,然后重新组成一个新的数使得这个数达到最小.3.算法描述:这个问题第一眼看下去容易想到对数组不停的排序然后不断删掉最大的,但是按着这个思路去做却发现,不断提取整型数组然后排序会比较复杂,因为要不断求余数等等,而且代码不

算法的第四章实践报告

分析程序存储问题.内容包括:   1. 实践题目 设有n 个程序要存放在长度为L的磁带上.各个程序存放在磁带上的长度已列出. 程序存储问题要求确定使得n  个程序能够在磁带上存储尽可能多的程序的一个存储方案.       2.问题描述 要求每次选择长度最小的程序放入磁带中,使得能放入的程序量最多       3.算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质) 每次选择剩下的程序中长度最小的程序,如会场安排问题,按小集合排在前来遍历,也即是“贪心策略”.

linux第四章实验报告

Linux第四章 用户和文件权限管理 实验环境 公司的linux主机即将提供给技术部作为开发服务器使用,根据部门内项目组的构成情况,首先需要建立相应的组账号.用户账号,并作为目录设置权限,还需要设置一个共用的数据存储目录,便于同事之间的数据交换. 需求描述 1.建立用户目录 创建目录/tech/benet和/tech/accp,分别用于存放各项目组中用户账号的宿主文件夹.例如,kylin用户的宿主目录应位于/tech/benet/kylin. 2.添加组账户 为两个项目组添加组账号benet,a

【实践报告】算法第二章实践报告

实践报告任选一题进行分析. 1.实践题目: 7-1 二分查找 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入格式:输入共三行: 第一行是n值: 第二行是n个整数: 第三行是x值. 输出格式:输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 2.问题描述: 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使

第四章上机报告

彭悦怡 20181003018 一.实践题目 4-1 程序存储问题 (90 分) 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L.接下来的1行中,有n个正整数,表示程序存放在磁带上的长度. 输出格式:

第二章实践报告

1.实践题目:二分查找 2.问题描述: 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 3.算法描述: while(left<=right){ //左右比较 int middle=(left+right)/2; //取中值 t++; //运算次数加一 if(x==a[middle]){ //查找值与数组middle位置的值相等时输出 cout<<midd

算法第二章实践报告

第一道题: 第一道题要求输出查找次数,一开始我们小组用了两个二分查找算法来实现一个返回下标,一个返回计数器的值.但后来经过老师指点,我们采取了全局变量,来作为计数器,其值也是查找次数. 第二道题: 第二道题要求找不到目标的时候可以返回最邻近的两个值的下标,所以我们又添加了i和j,在每次进行大小比较之后记住比较过的元素下标.最后只需要在找不到相应元素的时候输出i和j即可. 第三道题: 第三道题要求将两个序列重新整合之后再输出中位数.老师要求做出logn的算法,但因为对算法的不熟悉,我们小组在实践课

【实践报告】算法第三章实践报告

1.实践题目 7-2最大子段和 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 2.问题描述 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5 -2 输出样例: 在这里给出相应的输出.

第三章实践报告

实践题目:数字三角形 题目描述: 设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 算法描述:从下至上依次左右比较,大的那方和上面的数相加,直至第一列. 算法时间和空间复杂度分析:因为用到了双重循环,所以时间复杂度为o(n^2),同时使用了二维数组,所以空间复杂度也是o(n^2). 心得:这道题用从下至上的方法比较简单,要有逆向思维. 原文地址:https://www.cnblogs.com/ewerin/p/9943461.ht