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

c语言(贪心算法)

ACM程序设计 杭州电子科技大学 刘春英 acm@ 最近几天, 你 了吗? 每周一星(9): 第十讲 贪心算法(Greedy Algorithm) 导引问题:FatMouse' Trade 所谓“贪心算法”是指: 在对问题求解时,总是作出在当前看来是最好的选择。也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明)。 特别说明: 若要用贪心算法求解某问题的整体最优解,必须首先证明贪心思想在该问题的应用结果就是最优解!! 用事实说话—— 算法分析: 不妨用Begin[i]和End[i]表示事件i的开始时刻和结束时刻。则原题的要求就是找一个最长的序列a1=M,那么显然用M条长度为1的线段可以覆盖住所有的区间,所求的线段总长为M。 如果N=1,那么显然所需线段总长为:… 如果N=2,相当于N=1的情况下从某处断开(从哪儿断开呢?)。 如果N=k呢? 三、HDOJ_1050 Moving Tables Sample Input 3 4 10 20 30 40 50 60 70 80 2 1 3 2 200 3 10 100 20 80 30 50 算法分析: 1、如果没有交叉,总时间应该是多少? 2、影响搬运时间的因素是什么? 3、如果每趟处理都包含最大重叠,处理后的效果是什么? 4、得出什么结论? 附:参考源码(HDOJ-1050) #include using namespace std; int main() { int t,i,j,N,P[200]; int s,d,temp,k,min; cin>>t; for(i=0;i>N; for(j=0;j>s>>d; s=(s-1)/2; d=(d-1)/2; 贪心算法的基本步骤 1、从问题的某个初始解出发。 2、采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模。 3、将所有部分解综合起来,得到问题的最终解。 思考:田忌赛马-经典版 再思考:田忌赛马-升级版 谈谈自己的想法吧~ Case 1: King: 200 180 160 Tianji: 190 170 150 Case 2: King: 200 180 160 Tianji: 180 170 150 Case 3: King: 200 180 160 Tianji: 180 155 150 总体的思路是什么? 提醒: 很多贪心类型的题目都象本题一样,不是最朴素的贪心,而是需要做一些变化,对于我们,关键是找到贪心的本质! 思考题 再思考: 最后思考(青蛙的邻居): Sample Input 3 7 4 3 1 5 4 2 1 6 4 3 1 4 2 0 6 2 3 1 1 2 1 问题的本质是? 可图性判定! Havel-Hakimi定理 回看原题—— Sample Input 3 7 4 3 1 5 4 2 1 6 4 3 1 4 2 0 6 2 3 1 1 2 1 贪心算法的常见前提操作: 排序! 关于排序 你在编程中常用的方法? 自己写?(基本功) 调用排序函数?(方便) 常用排序函数 qsort() C语言 sort() C++ 关于qsort() 头文件: stdlib.h 调用示例: int cmp ( const void *a , const void *b ) { return *(int *)a- *(int *)b; } int num[10]={1,4,7,2,5,8,3,6,9,0}; qsort(num,10,sizeof(num[0]),cmp); 详细使用方法见论坛帖子—— 七种qsort排序方法 /forum/read.php?tid=535 提

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值