1042 Gone Fishing(枚举+贪心)

思路:枚举湖的个数,然后贪心选择鱼最多的湖。

在枚举湖的个数时,先把湖之间“奔走”的时间单独算出来,用总的时间减去“奔走”的时间,就是纯粹钓鱼的时间。然后再算出总的钓鱼的次数,对每次钓鱼选择鱼最多的那个湖钓,这样算出来的就是钓的最多的鱼的方案。

注意一些细节:

1、题中要求的是当湖中鱼的个数相等时,就在湖的编号小的湖中钓。

2、当全部的湖中,鱼都钓完了,就在第一个湖中钓。

下面是源代码:

[cpp]  view plain copy
  1. #include "stdio.h"  
  2. #include "string.h"  
  3. typedef struct   
  4. {  
  5.     int f;  
  6.     int t;  
  7.     int d;  
  8. }Node;  
  9. int main()  
  10. {  
  11.     //freopen("in.txt","r",stdin);  
  12.     int n,h,total;  
  13.     int i,j,k,v;  
  14.     int rt;//路上的时间  
  15.     int fc;//总共钓鱼的次数  
  16.     Node node[26],node2[26];  
  17.     int lt[26],tt[26];  
  18.     while(scanf("%d",&n)!=EOF && n!=0)  
  19.     {  
  20.         memset(tt,0,sizeof(tt));  
  21.         memset(node2,0,sizeof(node2));  
  22.         total=0;  
  23.         scanf("%d",&h);  
  24.         for(i=1;i<=n;i++)  
  25.             scanf("%d",&node2[i].f);  
  26.         for(i=1;i<=n;i++)  
  27.             scanf("%d",&node2[i].d);  
  28.         for(i=1;i<=n-1;i++)  
  29.             scanf("%d",&node2[i].t);  
  30.         int max=-2;  
  31.         for(i=1;i<=n;i++)  
  32.         {//枚举钓鱼的湖的个数  
  33.             memset(lt,0,sizeof(lt));  
  34.             memset(node,0,sizeof(node));  
  35.             total=0;  
  36.             rt=0;  
  37.             for(j=0;j<i;j++)  
  38.                 rt+=node2[j].t*5;  
  39.             fc=(60*h-rt)/5;//计算出总共钓鱼的次数  
  40.             for(j=1;j<=n;j++)  
  41.             {  
  42.                 node[j].f=node2[j].f;  
  43.                 node[j].d=node2[j].d;  
  44.                 node[j].t=node2[j].t;  
  45.             }  
  46.             for(j=1;j<=fc;j++)  
  47.             {//对每一次钓鱼贪心的选择鱼最多的湖钓鱼  
  48.                 int maxn=-2;  
  49.                 for(k=1;k<=i;k++)  
  50.                     if(node[k].f>maxn)  
  51.                     {  
  52.                         maxn=node[k].f;  
  53.                         v=k;//找到鱼最多的湖  
  54.                     }  
  55.                 if(node[v].f>0)  
  56.                 {//有鱼可以钓  
  57.                     total+=node[v].f;  
  58.                     node[v].f-=node[v].d;  
  59.                     lt[v]+=5;  
  60.                 }  
  61.                 else//没有鱼钓了,就在第一个湖里花费时间  
  62.                     lt[1]+=5;  
  63.             }  
  64.             if(total>max)  
  65.             {  
  66.                 max=total;  
  67.                 for(j=1;j<=n;j++)  
  68.                     tt[j]=lt[j];  
  69.             }  
  70.         }  
  71.         for(i=1;i<n;i++)  
  72.             printf("%d, ",tt[i]);  
  73.         printf("%d/n",tt[n]);  
  74.         printf("Number of fish expected: %d/n/n",max);  
  75.     }  
  76.     return 0;  
  77. }  
 

说说我做这个题时的困惑:首先思路我是明白的,但是细节我没有设计好,在找鱼最多的湖时,我用了库函数的排序函数,对以湖中鱼的个数对湖进行排序,但是这个函数是个稳定的排序,当两个湖中鱼的数量相等时,湖的编号小的排不到前面,导致WA了很久。后来就放弃了这种做法,直接找最大值,这样用这种方法的特性,反而避免了这种问题,很快就对了,看了不能总是省懒劲儿啊,关键是思路要正确!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值