c语言贪心算法ppt,c语言(贪心算法).ppt

c语言(贪心算法).ppt

ACM程序设计,杭州电子科技大学 刘春英 ,2018/12/23,2,最近几天,,你 了吗,AC,2018/12/23,3,每周一星(9),qfwr,2018/12/23,4,第十讲,贪心算法 (Greedy Algorithm),2018/12/23,5,导引问题FatMouse Trade,2018/12/23,6,所谓“贪心算法”是指,在对问题求解时,总是作出在当前看来是最好的选择。也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明)。,2018/12/23,7,特别说明,若要用贪心算法求解某问题的整体最优解,必须首先证明贪心思想在该问题的应用结果就是最优解,2018/12/23,8,用事实说话,2018/12/23,9,一、事件序列问题已知N个事件的发生时刻和结束时刻(见下表,表中事件已按结束时刻升序排序)。一些在时间上没有重叠的事件,可以构成一个事件序列,如事件 2,8,10。事件序列包含的事件数目,称为该事件序列的长度。请编程找出一个最长的事件序列。,2018/12/23,10,算法分析,不妨用Begini和Endi表示事件i的开始时刻和结束时刻。则原题的要求就是找一个最长的序列a1a2an,满足 Begina1Enda1 BeginanEndan,可以证明,如果在可能的事件a1a2an中选取在时间上不重叠的最长序列,那么一定存在一个包含a1(结束最早)的最长序列。 (证明略),2018/12/23,11,思考,请谈谈自己的解题思路,2018/12/23,12,思考题,2037 今年暑假不AC,2018/12/23,13,二、区间覆盖问题用i来表示x轴上坐标为i-1,i的区间(长度为1),并给出M1M200个不同的整数,表示M个这样的区间。现在让你画几条线段覆盖住所有的区间,条件是每条线段可以任意长,但是要求所画线段之和最小,并且线段的数目不超过N1N50。 例如M5个整数1、3、4、8和11表示区间,要求所用线段不超过N3条 0 1 2 3 4 5 6 7 8 9 10 11,2018/12/23,14,算法分析,如果NM,那么显然用M条长度为1的线段可以覆盖住所有的区间,所求的线段总长为M。 如果N1,那么显然所需线段总长为 如果N2,相当于N1的情况下从某处断开(从哪儿断开呢)。 如果Nk呢,2018/12/23,15,三、HDOJ_1050 Moving Tables,Sample 3 4 10 20 30 40 50 60 70 80 2 1 3 2 200 3 10 100 20 80 30 50,Sample Output 10 20 30,2018/12/23,16,算法分析,1、如果没有交叉,总时间应该是多少 2、影响搬运时间的因素是什么 3、如果每趟处理都包含最大重叠,处理后的效果是什么 4、得出什么结论,2018/12/23,17,附参考源码HDOJ-1050,include using namespace std; int main int t,i,j,N,P200; int s,d,temp,k,min; cint; fori0;iN; forj0;jsd; ss-1/2; dd-1/2;,ifsd temps; sd; dtemp; forks;kmin minPj; coutmin*10endl; return 0; ,2018/12/23,18,贪心算法的基本步骤,1、从问题的某个初始解出发。 2、采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模。 3、将所有部分解综合起来,得到问题的最终解。,2018/12/23,19,思考田忌赛马-经典版,2018/12/23,20,再思考田忌赛马-升级版,2018/12/23,21,谈谈自己的想法吧,各位,2018/12/23,22,Case 1,King 200 180 160 Tianji 190 170 150,2018/12/23,23,Case 2,King 200 180 160 Tianji 180 170 150,2018/12/23,24,Case 3,King 200 180 160 Tianji 180 155 150,2018/12/23,25,总体的思路是什么,本题小结,2018/12/23,26,提醒,很多贪心类型的题目都象本题一样,不是最朴素的贪心,而是需要做一些变化,对于我们,关键是找到贪心的本质,2018/12/23,27,思考题,2018/12/23,28,再思考,HDOJ_1007 Quoit Design,2018/12/23,29,Sample 3 7 4 3 1 5 4 2 1 6 4 3 1 4 2 0 6 2 3 1 1 2 1,Sample Output YES NO YES,最后思考(青蛙的邻居),2018/12/23,30,问题的本质是,可图性判定,两个概念 1、度序列若把图G所有顶点的度数排成一个序列S,则称S为图G的度序列。 2、序列是可图的一个非负整数组成的有限序列如果是某个无向图的度序列,则称该序列是可图的。,2018/12/23,31,Havel-Hakimi定理,练习 1、度序列7,7,4,3,3,3,2,1 2、度序列5,4,3,3,2,2,2,1,1,1,由非负整数组成的非增序列Sd1, d2 ,., dn n2,d11是可图的,当且仅当序列S1d2-1,d3-1,.,dd11-1,dd12,.,dn是可图的。其中,序列S1中有n-1个非负整数,S序列中d1后的前d1个度数即d2dd11减1后构成S1中的前d1个数。,2018/12/23,32,Sample 3 7 4 3 1 5 4 2 1 6 4 3 1 4 2 0 6 2 3 1 1 2 1,Sample Output YES NO YES,回看原题,2018/12/23,33,贪心算法的常见前提操作,排序,2018/12/23,34,关于排序,你在编程中常用的方法 自己写(基本功) 调用排序函数(方便) 常用排序函数 qsort C语言 sort C,2018/12/23,35,关于qsort,头文件 stdlib.h 调用示例 int cmp const void *a , const void *b return *int *a- *int *b; int num101,4,7,2,5,8,3,6,9,0; qsortnum,10,sizeofnum0,cmp; 详细使用方法见论坛帖子 七种qsort排序方法 提醒本贴子部分内容有误,2018/12/23,36,关于sort,包含文件algorithm 调用示例 int num101,4,7,2,5,8,3,6,9,0; sortnum,num10; 详细使用方法 去搜吧,2018/12/23,37,相关练习,201209ACM程序设计作业(10) 刘春英老师,2018/12/23,38,Welcome to HDOJ,Thank You ,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值