第4章-贪心算法-习题.ppt
《第4章-贪心算法-习题.ppt》由会员分享,可在线阅读,更多相关《第4章-贪心算法-习题.ppt(38页珍藏版)》请在冰豆网上搜索。
1第第第第4444章章章章贪贪心算法心算法心算法心算法2课程安排课程安排12345678910111213141516周二周二PPPPTTTTPPTTTTPPTTTTPPTTTTTTTTPP周四周四PPPPPPPPPPPPPPPPPPPPPPPPPPPP端午端午考试考试TT3第第4章章贪心算法贪心算法1.会场安排问题会场安排问题2.最优合并问题最优合并问题3.磁带最优存储问题磁带最优存储问题4.磁盘文件最优存储问题磁盘文件最优存储问题5.程序存储问题程序存储问题6.最优服务次序问题最优服务次序问题7.多处最优服务次序问题多处最优服务次序问题8.d森林问题森林问题9.汽车加油问题汽车加油问题10.区间覆盖问题区间覆盖问题11.硬币找钱问题硬币找钱问题12.删数问题删数问题13.数列极差问题数列极差问题14.嵌套箱问题嵌套箱问题15.套汇问题套汇问题16.信号增强装置问题信号增强装置问题17.磁带最大利用率问题磁带最大利用率问题18.非单位时间任务安排问题非单位时间任务安排问题19.多元多元Huffman编码问题编码问题20.多元多元Huffman编码变形编码变形21.区间相交问题区间相交问题22.任务时间表问题任务时间表问题23.最优分解问题最优分解问题24.可重复最优分解问题可重复最优分解问题25.可重复最优组合分解问题可重复最优组合分解问题26.旅行规划问题旅行规划问题27.登山机器人问题登山机器人问题6算法实现题算法实现题4-5程序存储问题程序存储问题问题描述:
问题描述:
设有设有n个程序个程序1,2,n要存放在长度为要存放在长度为L的磁带上。
的磁带上。
程序程序i存放在磁带上的长度是存放在磁带上的长度是li,1in。
程序存储问题要求确定这程序存储问题要求确定这n个程序在磁带上的一个个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。
存储方案,使得能够在磁带上存储尽可能多的程序。
编程任务:
编程任务:
对于给定的对于给定的n个程序存放在磁带上的长度,编程计算个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数。
磁带上最多可以存储的程序数。
7算法实现题算法实现题4-5程序存储问题程序存储问题数据输入:
数据输入:
第一行是第一行是2个正整数,分别表示文件个数个正整数,分别表示文件个数n和磁带的长和磁带的长度度L。
接下来的。
接下来的1行中,有行中,有n个正整数,表示程序存放在磁个正整数,表示程序存放在磁带上的长度。
带上的长度。
结果输出结果输出:
最多可以存储的程序数。
最多可以存储的程序数。
输入示例输入示例650231388020输出示例输出示例5i012345x2313880208intgreedy(vectorx,intm)inti=0,sum=0,n=x.size();sort(x.begin(),x.end();while(in)sum+=xi;if(sum=m)i+;elsereturni;returnn;/所有的程序都没有磁带长所有的程序都没有磁带长算法实现题算法实现题4-5程序存储问题程序存储问题i012345x238132080贪心策略:
最短程序优先贪心策略:
最短程序优先排序后的数据排序后的数据9算法实现题算法实现题4-6最优服务次序问题最优服务次序问题问题描述:
问题描述:
设有设有n个顾客同时等待一项服务。
顾客个顾客同时等待一项服务。
顾客i需要的服务需要的服务时间为时间为ti,1=i=n。
应如何安排。
应如何安排n个顾客的服务次序个顾客的服务次序才能使平均等待时间达到最小才能使平均等待时间达到最小?
平均等待时间是平均等待时间是n个顾个顾客等待服务时间的总和除以客等待服务时间的总和除以n。
编程任务:
编程任务:
对于给定的对于给定的n个顾客需要的服务时间,编程计算最优个顾客需要的服务时间,编程计算最优服务次序。
服务次序。
10算法实现题算法实现题4-6最优服务次序问题最优服务次序问题数据输入:
数据输入:
第一行是正整数第一行是正整数n,表示有,表示有n个顾客。
接下来的个顾客。
接下来的1行行中,有中,有n个正整数,表示个正整数,表示n个顾客需要的服务时间。
个顾客需要的服务时间。
结果输出结果输出:
计算出的最小平均等待时间。
计算出的最小平均等待时间。
输入示例输入示例1056121991000234335599812输出示例输出示例532.0011算法实现题算法实现题4-6最优服务次序问题最优服务次序问题doublegreedy(vectorx)inti,n=x.size();sort(x.begin(),x.end();for(i=1;in;+i)xi+=xi-1;doublet=0;for(i=0;in;+i)t+=xi;t/=n;returnt;i0123456789x11233555699992348121000加加1134610115725635558914012401定义:
定义:
vectorx;读取数据:
读取数据:
intn;scanf(“%d”,&n);inttemp;for(inti=0;in;i+)scanf(“%d”,&temp);x.push_back(temp);12算法实现题算法实现题4-7多处最优服务次序问题多处最优服务次序问题问题描述:
问题描述:
设有设有n个顾客同时等待一项服务。
顾客个顾客同时等待一项服务。
顾客i需要的服务需要的服务时间为时间为ti,1=i=n。
共有。
共有s处可以提供此项服务。
应处可以提供此项服务。
应如何安排如何安排n个顾客的服务次序才能使平均等待时间达个顾客的服务次序才能使平均等待时间达到最小到最小?
平均等待时间是平均等待时间是n个顾客等待服务时间的总和个顾客等待服务时间的总和除以除以n。
编程任务:
编程任务:
对于给定的对于给定的n个顾客需要的服务时间和个顾客需要的服务时间和s的值,编程的值,编程计算最优服务次序。
计算最优服务次序。
13算法实现题算法实现题4-7多处最优服务次序问题多处最优服务次序问题数据输入:
数据输入:
第一行有第一行有2个正整数个正整数n和和s,表示有,表示有n个顾客且有个顾客且有s处可以提供顾客需要的服务。
接下来的处可以提供顾客需要的服务。
接下来的1行中,有行中,有n个个正整数,表示正整数,表示n个顾客需要的服务时间。
个顾客需要的服务时间。
结果输出结果输出:
最小平均等待时间。
最小平均等待时间。
输入示例输入示例10256121991000234335599812输出示例输出示例33614算法实现题算法实现题4-7多处最优服务次序问题多处最优服务次序问题doublegreed(vectorx,ints)vectorst(s+1,0);vectorsu(s+1,0);intn=x.size();sort(x.begin(),x.end();inti=0,j=0;while(in)stj+=xi;suj+=stj;+i,+j;if(j=s)j=0;doublet=0;for(i=0;is;+i)t+=sui;t/=n;returnt;i0123456789x11233555699992348121000排序后的数据排序后的数据st服务数组服务数组01112su求和数组求和数组0111215算法实现题算法实现题4-9汽车加油问题汽车加油问题问题描述问题描述一辆汽车加满油后可行驶一辆汽车加满油后可行驶nkm。
旅途中有若干个加。
旅途中有若干个加油站。
设计一个有效算法,指出应在哪些加油站停靠油站。
设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。
加油,使沿途加油次数最少。
编程任务编程任务对于给定的对于给定的n和和k个加油站位置,编程计算最少加油个加油站位置,编程计算最少加油次数。
次数。
16算法实现题算法实现题4-9汽车加油问题汽车加油问题数据输入数据输入第第1行有行有2个正整数个正整数n和和k,表示汽车加满油后可行驶,表示汽车加满油后可行驶nkm,且旅途有且旅途有k个加油站。
接下来的一行中,有个加油站。
接下来的一行中,有k+1个整数,表示个整数,表示第第k个加油站与第个加油站与第k-1个加油站之间的距离。
第个加油站之间的距离。
第0个加油站表个加油站表示出发地,汽车已加满油。
第示出发地,汽车已加满油。
第k+1个加油站表示目的地。
个加油站表示目的地。
结果输出结果输出计算出的最少加油次数。
如果无法到达目的地,则输出计算出的最少加油次数。
如果无法到达目的地,则输出”NoSolution”。
输入示例输入示例7712345166输出示例输出示例4起点起点终点终点加油站数加油站数01234567812345166x17算法实现题算法实现题4-9汽车加油问题汽车加油问题intgreedy(vectorx,intn)intj,i,s,sum=0,k=x.size();for(j=0;jn)coutNoSoultionendl;return-1;for(i=0,s=0;in)sum+,s=xi;returnsum;k01234567x12345166i=310i=49i=612i=712起点起点终点终点加油站数加油站数01234567812345166x18算法实现题算法实现题4-9汽车加油问题汽车加油问题读取数据:
读取数据:
intt,n,k;scanf(%d%d,&n,&k);vectorx;for(inti=0;i=0)printf(%dn,temp);19算法实现题算法实现题4-10区间覆盖问题区间覆盖问题问题描述:
问题描述:
设设x1,x2,.,xn是实直线上的是实直线上的n个点。
用固定长度个点。
用固定长度的闭区间覆盖这的闭区间覆盖这n个点,至少需要多少个这样的固定个点,至少需要多少个这样的固定长度闭区间长度闭区间?
设计解此问题的有效算法。
设计解此问题的有效算法。
编程任务:
编程任务:
对于给定的实直线上的对于给定的实直线上的n个点和闭区间的长度个点和闭区间的长度k,编,编程计算覆盖点集的最少区间数。
程计算覆盖点集的最少区间数。
20算法实现题算法实现题4-10区间覆盖问题区间覆盖问题数据输入:
数据输入:
第一行有第一行有2个正整数个正整数n和和k,表示有,表示有n个点,且固定长个点,且固定长度闭区间的长度为度闭区间的长度为k。
接下来的。
接下来的1行中,有行中,有n个整数,个整数,表示表示n个点在实直线上的坐标(可能相同)。
个点在实直线上的坐标(可能相同)。
结果输出结果输出:
最少区间数。
最少区间数。
输入示例输入示例7312345-26输出文件示例输出文件示例30123456-2-1012345621算法实现题算法实现题4-10区间覆盖问题区间覆盖问题intgreedy(vectorx,intk)inti,sum=1,n=x.size();sort(x.begin(),x.end();inttemp=x0;/区间的起始位置区间的起始位置for(i=1;ik)sum+,temp=xi;returnsum;0123456-2-1012345622算法实现题算法实现题4-12删数问题删数问题问题描述:
问题描述:
给定给定n位正整数位正整数a,去掉其中任意,去掉其中任意kn个数字后,剩下个数字后,剩下的数字按原次序排列组成一个新的正整数。
对于给定的的数字按原次序排列组成一个新的正整数。
对于给定的n位正整数位正整数a和正整数和正整数k,设计一个算法找出剩下数字组成,设计一个算法找出剩下数字组成的新数最小的删数方案。
的新数最小的删数方案。
编程任务:
编程任务:
对于给定的正整数对于给定的正整数a,编程计算删去,编程计算删去k个数字后得到的个数字后得到的最小数。
最小数。
23算