- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
贪心算法应用实例
PAGE
PAGE 9
贪心算法的应用实例
例2.排队问题
【题目描述】
在一个医院B 超室,有n个人要做不同身体部位的B超,已知每个人需要处理的时间为ti,(0i=n),请求出一种排列次序,使每个人排队等候时间总和最小。
输入数据:第1行一个正整数n(你=10000》,第2行有n
个不超过 1000的正整数ti.
输出要求:n个人排队时间最小总和。
输入输出样例
输入:4
5 10 8 7
输出:
67
【算法分析】
本题贪心算法:n个人时间从小到大排序,就是这n个人最佳排队方案。求部分和的和即为所求。
反证法证明:假设有最优解序列:s1,s2…sn,如s1不是最小的Tmin,不妨设sk=Tmin,将s1与sk对调,显然,对sk之后的人无影响,对sk之前的人等待都减少了,(s1-sk)0,从而新的序列比原最优序列好,这与假设矛盾,故s1为最小时间,同理可证s2…sn依次最小。
例3.:数列极差问题
【题目描述】
在黑板上写了N个正整数做成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的max,最小的为min,则该数列的极差定义为M=max-min。
编程任务:对于给定的数列,编程计算出极差M。
输入输出样例:
输入:
4
2 1 4 3
输出:
13
【算法分析】
当看到此题时,我们会发现求max与求min是两个相似的过程。若我们把求解max与min的过程分开,着重探讨求max的问题。
下面我们以求max为例来讨论此题用贪心策略求解的合理性。
讨论:假设经(N-3)次变换后得到3个数:a ,b , max'(max'≥a≥b),其中max'是(N-2)个数经(N-3)次f变换后所得的最大值,此时有两种求值方式,设其所求值分别为 z1,z2,则有:z1=(a×b+1)×max'+1,z2=(a×max'+1)×b+1所以z1-z2=max'-b≥0若经(N-2)次变换后所得的3个数为:m,a,b(m≥a≥b)且m不为(N-2)次变换后的最大值,即m<max'则此时所求得的最大值为:
z3=(a×b+1)×m+1此时z1-z3=(1+ab)(max'-m)>0 所以此时不为最优解。
所以若使第k(1≤k≤N-1)次变换后所得值最大,必使(k-1)次变换后所得值最大(符合贪心策略的特点2),在进行第k次变换时,只需取在进行(k-1)次变换后所得数列中的两最小数p,q施加f操作:p←p×q+1,q←∞即可(符合贪心策略特点1),因此此题可用贪心策略求解。在求min时,我们只需在每次变换的数列中找到两个最大数p,q施加作用 f:p←p×q+1,q←-∞即可.原理同上。
这是一道两次运用贪心策略解决的一道问题,它要求选手有较高的数学推理能力。
例4.整数区间range.cpp
【题目描述】
我们定义一个整数区间[a,b],a,b是一个从a开始至b 结束的连续整数的集合。编一个程序,对给定的 n个区间,找出满足下述条件的所含元素个数最少的集合中元素的个数:对于所给定的每一个区间,都至少有两个不同的整数属于该集合。(1=n=10000, 0=a=b=1000)
输入输出格式:
输入:第一行一个正整数n,接下来有n行,每行给定一个区间的a,b值
输出:一个正整数,即满足条件的集合所包含的最少元素个数
输入输出样例
输入: 输出:
4 4
3 6
2 4
0 2
4 7
【算法分析】
本题数据规模较大,用搜索做会超时,而动态规划无从下手。考虑贪心算法。题目意思是要找一个集合,该集合中的数的个数既要少又要和所给定的所有区间有交集。(每个区间至少有两个该集合中的数)。我们可以从所给的区间中选数,为了选尽量少的数,应该使所选的数和更多的区间有交集这就是贪心的标准。一开始将所有区间按照右端点从小到大排序。从第一个区间开始逐个向后检查,看所选出的数与所查看的区间有无交集,有两个则跳过,只有一个数相交,就从当前区间中选出最大的一个数(即右端点),若无交集,则从当前区间选出两个数,就(右端点,右端点-1),直至最后一个区间。
#include iostream//整数区间问题
using namespace std;
struct prince{
int left,right;//区间左右端点
}a[10000];
int n;
int result;//存放结果中的数
int cmp(const void *a,const void *b){
return (*(prince *)a).right-(*
您可能关注的文档
最近下载
- 武汉市2025届高中毕业生四月调研考试 英语试卷(含答案详解).pdf
- 硕士研究生论文的选题与写作.ppt
- 2019年7月安徽省砀山县事业单位幼儿教师招聘考试《幼儿保教知识与能力》真题试卷(含答案).pdf VIP
- 确保室内空气质量的施工方案与技术措施.pdf
- 中小银行上云趋势研究分析报告 2024.pptx
- 证券从业人员证券投资基金基础知识题库与答案.doc
- 小学家长会英语老师课件.pptx VIP
- 第七单元《红楼梦》薛宝钗、林黛玉人物形象赏析 公开课一等奖创新教案统编版高中语文必修下册.docx VIP
- 最新部编版五年级下册语文单元教材分析(全册) .pdf VIP
- 春季学期《工业控制网络》试题.doc
文档评论(0)