思路:枚举湖的个数,然后贪心选择鱼最多的湖。
在枚举湖的个数时,先把湖之间“奔走”的时间单独算出来,用总的时间减去“奔走”的时间,就是纯粹钓鱼的时间。然后再算出总的钓鱼的次数,对每次钓鱼选择鱼最多的那个湖钓,这样算出来的就是钓的最多的鱼的方案。
注意一些细节:
1、题中要求的是当湖中鱼的个数相等时,就在湖的编号小的湖中钓。
2、当全部的湖中,鱼都钓完了,就在第一个湖中钓。
下面是源代码:
- #include "stdio.h"
- #include "string.h"
- typedef struct
- {
- int f;
- int t;
- int d;
- }Node;
- int main()
- {
- //freopen("in.txt","r",stdin);
- int n,h,total;
- int i,j,k,v;
- int rt;//路上的时间
- int fc;//总共钓鱼的次数
- Node node[26],node2[26];
- int lt[26],tt[26];
- while(scanf("%d",&n)!=EOF && n!=0)
- {
- memset(tt,0,sizeof(tt));
- memset(node2,0,sizeof(node2));
- total=0;
- scanf("%d",&h);
- for(i=1;i<=n;i++)
- scanf("%d",&node2[i].f);
- for(i=1;i<=n;i++)
- scanf("%d",&node2[i].d);
- for(i=1;i<=n-1;i++)
- scanf("%d",&node2[i].t);
- int max=-2;
- for(i=1;i<=n;i++)
- {//枚举钓鱼的湖的个数
- memset(lt,0,sizeof(lt));
- memset(node,0,sizeof(node));
- total=0;
- rt=0;
- for(j=0;j<i;j++)
- rt+=node2[j].t*5;
- fc=(60*h-rt)/5;//计算出总共钓鱼的次数
- for(j=1;j<=n;j++)
- {
- node[j].f=node2[j].f;
- node[j].d=node2[j].d;
- node[j].t=node2[j].t;
- }
- for(j=1;j<=fc;j++)
- {//对每一次钓鱼贪心的选择鱼最多的湖钓鱼
- int maxn=-2;
- for(k=1;k<=i;k++)
- if(node[k].f>maxn)
- {
- maxn=node[k].f;
- v=k;//找到鱼最多的湖
- }
- if(node[v].f>0)
- {//有鱼可以钓
- total+=node[v].f;
- node[v].f-=node[v].d;
- lt[v]+=5;
- }
- else//没有鱼钓了,就在第一个湖里花费时间
- lt[1]+=5;
- }
- if(total>max)
- {
- max=total;
- for(j=1;j<=n;j++)
- tt[j]=lt[j];
- }
- }
- for(i=1;i<n;i++)
- printf("%d, ",tt[i]);
- printf("%d/n",tt[n]);
- printf("Number of fish expected: %d/n/n",max);
- }
- return 0;
- }
说说我做这个题时的困惑:首先思路我是明白的,但是细节我没有设计好,在找鱼最多的湖时,我用了库函数的排序函数,对以湖中鱼的个数对湖进行排序,但是这个函数是个稳定的排序,当两个湖中鱼的数量相等时,湖的编号小的排不到前面,导致WA了很久。后来就放弃了这种做法,直接找最大值,这样用这种方法的特性,反而避免了这种问题,很快就对了,看了不能总是省懒劲儿啊,关键是思路要正确!