文章标题 CSU 1859: Gone Fishing(贪心)

本文介绍了一个名为 GoneFishing 的算法问题,该问题涉及多个鱼塘及钓鱼时间分配。通过分析鱼塘间的关系和时间成本,采用贪心算法策略,实现了在限定时间内最大化钓鱼数目的目标。

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

1859: Gone Fishing

题目链接
题意:给出很多个鱼塘,告诉你每个鱼塘的初始鱼的数量,还有每个鱼 塘每五分钟鱼游走的鱼的数量以及每五分钟能够钓到的鱼的数量。 每个鱼塘之间有距离。然后问在一定时间内,能够最多能钓鱼多 少只,并且把在每个鱼塘停留钓鱼的时间输出,而且要求在第一 个鱼塘尽量呆的久。
分析:贪心,如果我们已经确定在号鱼塘内钓鱼,事先减去再 路上花费的时间。那么我们就不用管钓鱼的前后关系了。即先去 号鱼塘钓鱼,再去号鱼塘钓鱼,再去号鱼塘钓鱼这些路上的 时间不用再计算了。相当于可以随便钓,然后问最多钓多少鱼。 很显然,我们用贪心思想,每次取当前能够钓鱼数量最多的那个 鱼塘即可。
代码:

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<vector>
#include<math.h>
#include<map>
#include<queue> 
#include<algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;

int n,h;
int f[30];
int tmp_f[30];
int t[30];//岛与岛之间之间花费的时间 
int d[30];//每呆单位时间鱼减掉的数目 
int rec[30],rec_tmp[30]; 

int main ()
{
    int flag=0;
    while (scanf ("%d",&n)){
        if (n==0)break;
        if (flag)printf ("\n");
        else flag=1;
        int ans=0;
        scanf ("%d",&h);
        h*=12;//总时间
        for (int i=1;i<=n;i++){
            scanf ("%d",&f[i]);
            tmp_f[i]=f[i];
        } 
        for (int i=1;i<=n;i++){
            scanf ("%d",&d[i]);
        }
        t[0]=0;
        for (int i=1;i<=n-1;i++){
            scanf ("%d",&t[i]);
            t[i]+=t[i-1];//求到达第i+1个岛在路上花费的总时间 
        }
        for (int i=1;i<=n;i++){
            //走到第i个岛,先将路上的时间给减掉,然后剩下的就是可以在岛屿上呆的时间 
            int tt=h-t[i-1];
            //cout<<"tt="<<tt<<endl;
            if(tt<0)break; 
            memset(rec_tmp,0,sizeof (rec_tmp)); 
            int ans1=0;
            int Max=0,place=1;
            for (int j=1;j<=n;j++) tmp_f[j]=f[j];//每次从新赋值原始的鱼的数量 
            for (int k=0;k<tt;k++){
                Max=0;place=1;//在前i个岛中找到能钓到最多的鱼 
                for (int j=1;j<=i;j++){
                    if (Max<tmp_f[j]){
                        Max=tmp_f[j];
                        place=j;
                    }
                }
                ans1+=Max;//总数加上 
                tmp_f[place]-=d[place];//然后这个岛能钓到的鱼减掉d 
                rec_tmp[place]++;//在岛呆的时间加一 
                if (tmp_f[place]<0)tmp_f[place]=0; //如果小于0说哦名下次钓不到鱼,置零 
            }
            if (ans1>ans){
                ans=ans1;
                for (int j=1;j<=n;j++){//保存在每个岛呆的时间 
                    rec[j]=rec_tmp[j];
                }
            }
        }
        for (int i=1;i<=n;i++){
            if (i==1)printf ("%d",rec[i]*5);
            else printf (", %d",rec[i]*5); 
        } 
        printf ("\n");
        printf ("Number of fish expected: %d\n",ans);
    }       
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值