第四章作业
一、对贪心算法的理解:
贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择,而不是全局最优解。一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。贪心算法设计最关键的一点是贪心策略的选择。
二、请选择一道作业题目说明你的算法满足贪心选择性质
题目描述:4-3 最优合并问题
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
解题思路:
将输入的数按从小到大和从大到小分别排序,然后用a[i+1]和a[i]进行合并,获得合并后序列长度并存放在a[i+1]上,即a[i+1] = a[i]+a[i+1],然后把合并比较次数存放在sum,然后指针后跳一位,从a[i+1]处继续重新排序再合并存放,比较次数累加到sum,直到结束,从而求出最少比较次数。
最大比较次数同里。
贪心策略:从相邻且最小的数组依次合并,比较次数最少。相反则次数最大。
#include <iostream> #include <algorithm> using namespace std; bool compare(int a,int b) { return a>b; } int main() { int k; cin>>k; int a[1001],b[1001]; int sum = 0,sum1 = 0; for(int i = 0;i < k;i++){ cin>>a[i]; b[i] = a[i]; } sort(a,a+k); sort(b,b+k,compare); for(int i = 0;i<k-1;i++){//最好 a[i+1] = a[i]+a[i+1]; sum += a[i+1]-1; sort(a+i+1,a+k); // cout<<sum<<" "; } for(int i = 0;i<k-1;i++){//最坏 b[i+1] = b[i]+b[i+1]; sum1 += b[i+1]-1; sort(b+i+1,b+k,compare); } cout<<sum1<<" "<<sum<<endl; return 0; }
三、请说明在本章学习过程中遇到的问题及结对编程的情况
本次结对编程情况良好,经过磨合,现在暂无什么差错。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步