实验二 贪心算法的应用.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验二 贪心算法的应用 一、实验目的1.掌握贪心算法的基本概念和两个基本要素2.熟练掌握贪心算法解决问题的基本步骤。3.学会利用贪心算法解决实际问题。二、实验内容 1.问题描述:题目二:会场安排问题假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法来进行安排。试编程实现对于给定的k个待安排活动,计算使用的最少会场。输入数据中,第一行是k的值,接下来的k行中,每行有2个正整数,分别表示k个待安排活动的开始时间和结束时间,时间以0点开始的分钟计。输出为最少的会场数。输入数据示例51 2312 2825 3527 8036 50输出数据3三、算法分析Stept1:输入各个活动的开始时间(s)和结束时间(e),初始化各活动的会场号。Step2:按活动的开始时间和活动时间排序,s最早(第一优先级)和持续时间最短(第二优先级)的活动排在最前。Step3:执行贪婪算法,即s最早和持续时间最短的优先安排会场,并记录会场号,其余活动的s大于或等于已安排活动的e的安排在同一会场,若某活动的s小于安排活动的e,则安排在另一会场,记录会场号,依次循环,直到所有活动均被安排。Step4:统计会场号数,输出。时间复杂度:O(n)算法时间:O(nlogn)核心算法:void swap(Active a,Active b){Active t;t=a;a=b;b=t;}//活动时间排序for(i=1;i=k;i++){for(j=i;j=k;j++){if(a[i].sa[j].s)swap(a[i],a[j]);if(a[i].s==a[j].s){if(a[i].ea[j].e)swap(a[i],a[j]);}}}四、程序调试及运行结果分析五、源代码#includeiostreamusing namespace std;#define M 50 //最大活动数struct Active{int s;//开始时间int e;//结束时间int no;//预安排会场号}a[M];//两元素交换位置void swap(Active a,Active b){Active t;t=a;a=b;b=t;}void main(){int k;int i,j;cout输入待安排活动数:endl;cink;cout输入待安排活动的开始时间和结束时间:endl;//输入活动时间for(i=1;i=k;i++){cina[i].sa[i].e;a[i].no=0;}//活动时间排序for(i=1;i=k;i++){for(j=i;j=k;j++){if(a[i].sa[j].s)swap(a[i],a[j]);if(a[i].s==a[j].s){if(a[i].ea[j].e)swap(a[i],a[j]);}}}int sum=1;//使用的会场数初始化int n;a[1].no=sum;for(i=2;i=k;i++){for(n=1;ni;n++){if(a[n].no!=0a[n].e=a[i].s){a[i].no=a[n].no;a[n].no=0;//已经安排过的活动就不再比较break;}}if(n==i){sum+=1;a[i].no=sum;}}cout输出最少会场数:\nsumendl;system(pause);}2.问题描述:题目四:汽车加油问题一辆汽车加满油后,可行使n千米。旅途中有若干个加油站。若要使沿途加油次数最少,设计一个有效算法,对于给定的n和k个加油站位置,指出应在哪些加油站停靠加油才能使加油次数最少。输入数据中,第一行有2个正整数,分别表示汽车加满油后可行驶n千米,且旅途中有k个加油站。接下来的1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。输出为最少的加油次数,如果无法到达目的地,则输出“No Solution”。实验提示:把两加油站的距离放在数组中,a[1..k]表示从起始位置开始跑,经过k个加油站,a[i]表示第i-1个加油站到第i个加油站的距离。汽车在运行的过程中如果能跑到下一个站则不加油,否则要加油。输入数据示例7 71 2 3 4 5 1 6 6输出数据4三、算法分析对于这个问题有以下几种情况:(前提:行驶前车里加满油):设加油次数为k,每个加油站间距离为a[i];(i=0,1,2,3……n) 1.始点到终点的距离小于N,则加油次数k=0;2.始点到终点的距离大于N,A.加油站间的距离相等,即a[i]=a[j]=L=N,则加油次数最少k=n;B.加油站间的距离相等,即a[i]=a[j]=LN,则不可能到达终点;C.加油站间的距离相等,即a[i]=a[j]=LN,则加油次数k=n/N(n%N==0)或

文档评论(0)

yanpan1 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档