Chapter-05-贪心算法概要1.ppt

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Chapter-05-贪心算法概要1

5.13 ZOJ1161-GONE FISHING (3)采用贪心策略,每次选择鱼最多的湖钓一次鱼 对于每个湖来说,由于在任何时候鱼的数目只和约翰在该湖里钓鱼的次数有关,和钓鱼的总次数无关,所以这个策略是最优的。一共可以钓鱼time次,每次在n个湖中选择鱼最多的一个湖钓鱼。 采用贪心算法构造约翰的钓鱼计划。 可以认为约翰能从一个湖“瞬间转移”到另一个湖,即在任意一个时刻都可以从湖1到湖pos中任选一个钓一次鱼。 * 算法5.19选择鱼最多的湖钓鱼的贪心算法实现 //从湖1起到湖pos止,花费时间time(不含路程)的钓鱼计划 void greedy(int pos, int time) {   if (time = 0) return;      //时间已经用完   int i, j;   int fish[MAXN];   int p[MAXN];   int t = 0;   for (i = 0; i pos; ++i)     fish[i] = f[i];   memset(p, 0, sizeof(p));   …… } * 算法5.19选择鱼最多的湖钓鱼的贪心算法实现 //在时间time内,选择鱼最多的湖钓鱼;如果鱼都没有了,就把时间放在湖1上 for (i = 0; i time; ++i) {   int max = 0; //鱼最多的湖中,鱼的数量   int id = -1;     //鱼最多的湖的编号   //查找鱼最多的湖中,鱼的数量和湖的编号   for (j = 0; j pos; ++j)     if (fish[j] max){       max = fish[j];       id = j;     }   if (id != -1)      //找到了,进行钓鱼处理   {     ++p[id];     fish[id] -= d[id];     t += max;   }   //没有找到(从湖1起到湖pos全部钓完了),就把时间放在湖1上   else ++p[0]; } * 算法5.19选择鱼最多的湖钓鱼的贪心算法实现 //处理最优方案 if (t best) {   best = t;         //最优值   memset(plan, 0, sizeof(plan));   for (i = 0; i pos; ++i)  //最优解     plan[i] = p[i]; } * 算法5.19选择鱼最多的湖钓鱼的贪心算法实现 输出钓鱼计划时,再把5乘回去,就变成实际的钓鱼时间(分钟): for (i=0; in-1; ++i) printf(%d, , plan[i] * 5); printf(%d\n, plan[n-1] * 5); printf(Number of fish expected: %d\n, best); * 有一个空格 5.14 ZOJ1171-SORTING THE PHOTOS 假如你有n(1≤n≤105)张照片。有些照片正面朝上,而有些是反面朝上。 你的任务是排序,使所有的照片朝向一致。 唯一能做的操作是,从一堆照片的上面把需要翻转的照片挑出来放成一堆,把这堆照片翻转过来,放回到原来的那堆照片上。 编写程序:采用这样的操作方法完成排序,计算最少的操作次数。 * 输入样例 输出样例 1 //测试例数量 5 UU D UU 2 5.14 ZOJ1171-SORTING THE PHOTOS 由于照片多达105张,回溯算法肯定是太慢了。 必须找到一种翻转照片的方法,方法本身就是最优的。这里面有一个技巧,从一堆照片的上面取照片是不计操作次数的,只有翻转时才计算操作次数。因此逐张照片比较,如遇到照片不同时就翻转一次,再用当前照片的朝向接着比较。 例如,样例数据UUDUU,操作步骤如下: (1)先将UU放在一边,遇到D,将UU翻转,放到原来的堆上面,成为DDDUU; (2)将DDD放在一边,遇到U,将DDD翻转,放到原来的堆上面,成为UUUUU。 朝向就变成一样,操作次数是2。 编程时,还可以简化,从第一张照片开始与下一张照片比较,如果遇到照片朝向不同,则翻转次数加1,再用不同的那张照片朝向接着与下一张比较,直到结束。 * 算法5.20 翻转照片的贪心算法实现 int i; int n;          //照片的张数 char p[100000];     //存放照片 int N;          //数据块的数量 scanf(%d, N); while(N--) {   scanf(%d, n);   for(i = 0; i n; )   {

文档评论(0)

yaocen + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档