pku 1042 Gone Fishing

本文介绍了一个经典的贪心算法问题——钓鱼问题,并详细解释了如何通过枚举和贪心策略来找到最大钓鱼数量的解决方案。文章通过具体示例说明了如何处理多个湖泊之间的选择与转换,以及在不同条件下的最优策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:钓鱼的问题,求能够钓到鱼的最大值。

算法分类:贪心+枚举。首先枚举是在一个湖,还是两个湖直到n个湖钓鱼,在每个过程中用贪心法对每次钓鱼进行讨论,然后就是每次的时间需要减去从一个湖到另外一个湖的所有的时间。

难点:首先是对输入的数据的判断:

第一个数指湖的个数。

第二个数指钓鱼的时间小时。

第三排的数据:每个湖能掉到好多鱼每5分种。

第四排的数据:每钓鱼一次,每五分钟能钓到鱼的减少的个数。

第五排的数据:从i到i+1个湖所用的时间,单位为5分钟。

输出:第一排每个湖所花费的时间(分钟),第二排:总的鱼数。

分析:这道题目弄懂了就很简单,但是很烦,然后注意的地方是当没有鱼钓的时候,剩下的时间都给第一个湖。

代码:

#include <iostream>
using namespace std;
int fish[28],jianshao[28],walktime[28],totaltime[28],tempfish[28];//walktime可以用一个数解决 可以不需要数组

int main()
{
 int n;
 int h;
 int i,j,k,p;
 int maxfish,sum;
 int output[28],tempoutput[28];
 while(scanf("%d",&n)!=EOF && n)
 {
  scanf("%d",&h);
  h*=12;//单位是按照5分钟为单位的
  maxfish = 0;
  memset(output,0,sizeof(output));
  for(i = 0;i < n; i++)
   scanf("%d",&fish[i]);
  for(i = 0;i < n; i++)
   scanf("%d",&jianshao[i]);
  totaltime[0]=0;
  for(i = 1;i < n; i++)
  {
   scanf("%d",&walktime[i]);
   totaltime[i]=totaltime[i-1]+walktime[i];//totaltime【】指到i个湖钓鱼所要减掉的行走时间
  }
  maxfish=0;
  
  for(i = 1; i <=n; i++ )
  {
   memset(tempoutput,0,sizeof(tempoutput));
   
   for(j = 0;j < i;j++)
    tempfish[j]=fish[j];//一定要用tempfish保存 我就是在这wa了一次。因为下面的操作会对初始的数据进行破坏
   sum=0;
   for(j = 0; j < h - totaltime[i-1]; j++ )//j指的是能够钓鱼的次数
   {
    p=0;

    for( k = 1;k < i; k++ )//寻找最大指所在的p位置
    {
     if(tempfish[k]> tempfish[p])
      p=k;
    }
    if( tempfish[p] <= 0 )//最大值比0都还小了,所以将剩下的钓鱼次数都给第一个湖
    {
     tempoutput[0]+=h - totaltime[i-1] - j;
     break;
    }
    sum+=tempfish[p];
    tempfish[p]-=jianshao[p];
    tempoutput[p] ++;
   }
   if(sum > maxfish)
   {
    maxfish = sum;
    memcpy(output,tempoutput,sizeof(output));//可以百度百科一下这个函数,output是保存的最后输出的结果
    
   }
   if(sum == maxfish)//如果鱼的次数相同的时候,要求的是在最近的湖花费的时间最多。
   {
    for(k =0 ;k< i;k++)
     if(output[k]!=tempoutput[k])
      break;
     if(tempoutput[k] > output[k])
      memcpy(output,tempoutput,sizeof(tempoutput));

   }

  }
  for(i = 0 ; i < n-1;i++ )//输出也是难点,但不是重点 注意最后是两个换行
   printf("%d, ",output[i]*5);
  printf("%d/nNumber of fish expected: %d/n/n",output[n-1]*5,maxfish);
 }
 return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值