高中信息竞赛-贪心算法

上传人:好** 文档编号:110045511 上传时间:2019-10-28 格式:PPT 页数:55 大小:451KB
返回 下载 相关 举报
高中信息竞赛-贪心算法_第1页
第1页 / 共55页
高中信息竞赛-贪心算法_第2页
第2页 / 共55页
高中信息竞赛-贪心算法_第3页
第3页 / 共55页
高中信息竞赛-贪心算法_第4页
第4页 / 共55页
高中信息竞赛-贪心算法_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《高中信息竞赛-贪心算法》由会员分享,可在线阅读,更多相关《高中信息竞赛-贪心算法(55页珍藏版)》请在金锄头文库上搜索。

1、贪心策略,引 例,【问题描述】:在N行M列的正整数矩阵中,要求从每行中选出1个数,使得选出的总共N个数的和最大。 【试题分析】:本题可用贪心策略:选n次,每一次选相应行中的最大值即可。 读入n, m,矩阵数据; total= 0; for (i=1;i=n;i+) /对n行进行选择 选择第i行最大的数,记为k; total+=k; 输出最大总和total;,贪心算法,贪心的定义:指从问题的初始状态出发,向给定的目标推进。但不同的是,推进的每一步不是依据某一固定的递推式,而是作一个当时看似最佳的贪心策略,不断地将问题实例归纳为更小的相似的子问题,并期望通过所做的局部最优选择产生出一个全局最优解。

2、 重点:贪心策略的选取。 贪心与递推的区别是:推进的每一步不是依据一个固定的递推式,而是做一个当时看似最优的贪心选择。,鼠目寸光,引例2:在一个NM的方格阵中,每一格子赋予一个数(即为权)。规定每次移动时只能向上或向右。现试找出一条路径,使其从左下角至右上角所经过的权之和最大。 【分析】本题用贪心策略不能得到最优解,我们以24的矩阵为例。 若按贪心策略求解,所得路径为:1,3,4,6; 若按动态规划法求解,所得路径为:1,2,10,6。,贪心是一种解题策略,也是一种解题思想 使用贪心方法需要注意局部最优与全局最优的关系,选择当前状态的局部最优并不一定能推导出问题的全局最优,几个简单的贪心问题,

3、【最优装载问题】:给n个物体, 第i个物体重量为wi, 选择尽量多的物体, 使得总重量不超过C; 【部分背包问题】:有n个物体, 第i个物体的重量为wi, 价值为vi, 在总重量不超过C的情况下让总价值尽量高; 【乘船问题】:有n个人, 第i个人重量为wi. 每艘船的载重量为C, 最多乘两个人. 用最少的船装载所有人;,贪心策略:最优装载问题:先拿轻的,贪心策略:部分背包问题:先拿性价比高的,贪心策略:乘船问题:最轻的人和尽量重的人配对;,应用举例1-部分背包问题,【问题描述】:给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等。已知第i种食品最多拥有Wi公斤,其商品价值为Vi元/公

4、斤,编程确定一个装货方案,使得装入卡车中的所有物品总价值最大。,【试题分析】:因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解答,方法如下:先将单位块收益按从大到小进行排列,然后用循环从单位块收益最大的取起,直到不能取为止便得到了最优解。,问题初始化; /读入数据 按vi从大到小将商品排序; i= 1; While(m=0 /选择下一种商品 ,程序框架结构,贪心策略求解的问题,因此,利用贪心策略解题,需要解决两个问题: 首先,确定问题是否能用贪心策略求解;一般来说,适用于贪心策略求解的问题具有以下特点: 1.可通过局部的贪心选择来达到

5、问题的全局最优解。运用贪心策略解题,一般来说需要一步步的进行多次的贪心选择。在经过一次贪心选择之后,原问题将变成一个相似的,但规模更小的问题,而后的每一步都是当前看似最佳的选择,且每一个选择都仅做一次。 2.原问题的最优解包含子问题的最优解,即问题具有最优子结构的性质。在背包问题中,第一次选择单位质量最大的货物,它是第一个子问题的最优解,第二次选择剩下的货物中单位重量价值最大的货物,同样是第二个子问题的最优解,依次类推。 其次,如何选择一个贪心标准?正确的贪心标准可以得到问题的最优解,在确定采用贪心策略解决问题时,不能随意的判断贪心标准是否正确,尤其不要被表面上看似正确的贪心标准所迷惑。在得出

6、贪心标准之后应给予严格的数学证明。,应用举例2-删数问题,【问题描述】:键盘输入一 个高精度的正整数n(n=240位),去掉其中任意s个数字后剩下的数字按照原来的次序将组成一个新的正整数。编程对给定的n和s,寻求一种方案,使得剩下组成的新数最小。 输入:178546 4 输出:14,贪心策略:每一步总是选择一个使剩下的数最小的数字删去,即按高位到低位的顺序搜索,若各位数字递增,则输出最后一个数字;否则删除第一个递减区间的首字符,这样删一位便形成了一个新数字串。然后回到串首,按上述规则再删下一个数字。重复上述过程s次为止,剩下的数字便是问题的解。 N=178546 =17546 =1546 =1

7、46 =14,cinsm; n=s.length(); for(i=0;isj+1)/删除第一个递减区间的首字符 for(k=j;kn-1;k+)sk=sk+1; break; n- -;/否则删除递增区间的最后一个元素 i=0; while(si=0)i+;/去掉前面的0 for(j=i;jn;j+)coutsj;,应用举例3-纪念品分组2005,Description:元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为

8、了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。 Input:输入文件group.in包含n+2行: 第1行包括一个整数w,为每组纪念品价格之和的上限,第2行为一个整数n,表示购来的纪念品的总件数G 第3-n+2行每行包含一个正整数Pi (5 = Pi = w)w表示所对应纪念品的价格。 Output:输出文件group.out仅一行,包含一个整数,为最少的分组数目和。,应用举例3-纪念品分组2005,Sample Input 100 9 90 20 20 30 50 60 70 80 90 Samp

9、le Output:6,方法一:用快排,【思想】贪心,排序,2个指针扫描最小和最大配 ,可以的i+1,j-1,不行j-1,直到ij; void solve() int i=1,j=n,pair=0; while(ij) if(ai+aj=w) i+;j-; else j-; pair+; if(i=j) pair+; coutpairendl; ,方法二:用桶排序,int max,n,p,a201=0,t=0,i,j; cinmaxn; for(i=1;ip;ap+;/桶排序 for(i=max;i=1;i-)/分组 while(ai) ai-;t+; for(j=max-i;j0;j-) i

10、f(aj)aj-;break; couttendl;,应用举例4-排队打水问题,【问题描述】:有N个人排队到R个水龙头去打水,他们装满水桶的时间为T1,T2,Tn为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的时间最少?,【分析】:由于排队时,越靠前面的计算的次数越多,显然越小的排在越前面得出的结果越小(可以用数学方法简单证明),所以这道题可以用贪心法解答,基本步骤: 1.将输入的时间按从小到大排序; 2.将排序后的时间按顺序依次放入每个水龙头的队列中; 3.统计,输出答案。,应用举例5-取数游戏2341,Description:给出2n(n=100)个自然数(小于等于30000)。

11、将这n个自然数排成一列,游戏双方A和B从中取数,只允许从两端取数。A先取,然后双方轮流取数。取完时,谁取得数字总和最大为取胜方;若双方和相等,属B胜。试问A方是否有必胜策略? Input:两行,第一行一个整数n;第二行有2*n个自然数。 Output:第一行:若A有必胜策略,则输出yes,否则输出no Sample Input 4 7 9 3 6 4 2 5 3 Sample Output:yes,方法与技巧,运用贪心策略解题时,有的题目有不止一种可能的贪心标准,但不一定每种贪心标准都能够得到正确的结果。因此,在运用贪心法时,一定要仔细分析,选择恰当的贪心标准。,应用举例6-混合牛奶1648,

12、Description 牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要。请帮助快乐的牛奶制造者(merry milk makers)以可能的最廉价的方式取得他们所需的牛奶。快乐的牛奶制造公司从一些农民那购买牛奶,每个农民卖给牛奶制造公司的价格不一定相同。而且,如一只母牛一天只能生产一定量的牛奶,农民每一天只有一定量的牛奶可以卖。每天,快乐的牛奶制造者从每个农民那购买一定量的牛奶,少于或等于农民所能提供的最大值。 给出快乐牛奶制造者的每日的牛奶需求,连同每个农民的可提供的牛奶量和每加仑的价格,请计算快乐的牛奶制造者所要付出钱的最小值。注意:每天农民生产的牛奶

13、的总数对快乐的牛奶制造者来说足够的。 Input 第 1 行:二个整数, n 和 m。 第一个数值,n,(0= n=2,000,000)是快乐的牛奶制造者的一天需要牛奶的数量。 第二个数值,m,(0= m=5,000)是他们可能从农民那买到的数目。 第 2 到 m+1 行:每行二个整数,pi 和 ai。 pi(0= pi=1,000) 是农民 i 牛奶的价格。 ai(0 = ai = 2,000,000)是农民 i 一天能卖给快乐的牛奶制造者的牛奶数量。 Output:单独的一行包含单独的一个整数,表示快乐的牛奶制造者拿到所需的牛奶所要的最小费用,应用举例7-数列极差问题1647,Descri

14、ption:在黑板上写了N个正整数组成的一个数列,进行如下操作: 每次擦去其中的两个数a和b,然后在数列中加入一个数ab1,如此下去直至黑板上 剩下一个数,在所有按这种操作方式最后得到的数中,最大的为max,最小的为min, 则该数列的极差定义为Mmaxmin。 请你编程,对于给定的数列,计算极差。 Input:第一个数N表示 正整数序列长度(0N50000),随后是N个正整数。N为0表示输入结束。 Output:计算极差 Sample Input 3 1 2 3 0 Sample Output:2,应用举例7-均分纸牌,问题描述有 N 堆纸牌,编号分别为 1,2,, N。每堆上有若干张,但纸

15、牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: 9 8 17 6 移动3次可达到目的: 从 取 4 张牌放到 (9 8 13 10) - 从 取 3 张牌放到 (9 11 10 10)- 从 取 1 张牌放到(10 10 10 10)。 输 入:N(N 堆纸牌,1 = N = 100) A1 A2

16、An (N 堆纸牌,每堆纸牌初始数,l= Ai =10000) 输 出:所有堆均达到相等时的最少移动次数。 输入输出样例 4 9 8 17 6 屏慕显示: 3,应用举例8-均分纸牌,【试题分析】我们要使移动次数最少,就是要把浪费降至零。通过对具体情况的分析,可以看出在某相邻的两堆之间移动两次或两次以上,是一种浪费,因为我们可以把它们合并为一次或零次。因此,我们将相邻两堆间的移动次数限定在一次或零次。,应用举例7-均分纸牌,【分析】如果你想到把每堆牌的张数减去平均张数,题目就变成移动正数,加到负数中,使大家都变成0,那就意味着成功了一半!拿例题来说,平均张数为10,原张数9,8,17,6,变为-1,-2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号