poj1042

题目大意:

有n个湖,一个人在这些湖中钓鱼,5分钟钓一次,求给定的时间内能够钓的鱼的最大数量,他的起点是第一个湖泊,可以在任意湖泊终止

但是只能够往下走,不能返回,每次钓到的鱼会在上一次的基础上减少,当所有的湖泊里的鱼能够钓的数量为0时,但是时间还有剩,都算到第

一个湖泊上

输出在每一个湖泊呆的时间,及最大钓鱼数量

思路:

枚举+贪心

一一枚举所经过的湖泊,算出该情况的最优解,具体看代码

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 30;//湖的最大数目
const int M = 200;//钓鱼的最大次数,题目所给16小时,5分钟一单位,16*12
//time[i]代表在第i个湖钓鱼的次数,fish[i][j]在第i个湖第j次钓鱼的数量
int time[N],fish[N][M];
int movetime[N];//movetime[1]=0,movetime[i]代表从第i-1个湖移动到第i个湖所需时间
int d[N];//每隔一次钓鱼当再一次钓鱼时减少的数量
int n,h;
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF&&n)
    {
        int ans = 0;
        memset(time,0,sizeof(time));
        memset(movetime,0,sizeof(movetime));
        memset(fish,0,sizeof(fish));
        scanf("%d",&h);
        for(int i=1;i<=n;i++)
            scanf("%d",&fish[i][1]);
        for(int i=1;i<=n;i++)
            scanf("%d",&d[i]);
        for(int i=2;i<=n;i++)
            scanf("%d",&movetime[i]);
        int totalTime = h*12;
        time[1]=totalTime;//全0的情况,也就是不会钓到鱼,把所有的时间都花在第一个湖

        //初始化每个湖每次钓鱼的数量
        for(int i=1;i<=n;i++)
            for(int j=2;j<=totalTime;j++)
                fish[i][j]=max(fish[i][j-1]-d[i],0);//不可能是负数

        //枚举所有情况,即只在一个湖,两个湖.....n个湖能够钓到最多的鱼
        for(int k=1;k<=n;k++)
        {
            int maxFish = 0;
            //计算能够钓鱼的时间,就是减掉移动的时间
            int realTime=totalTime;
            for(int i=2;i<=k;i++)
                realTime-=movetime[i];
            if(realTime<=0)
                break;//总时间不够耗在路程上时,跳出
            //用来临时记录每个湖的钓鱼次数
            int temp[N];memset(temp,0,sizeof(temp));
            for(int tt=1;tt<=realTime;tt++)
            {
                //找出每次钓鱼能够最多数量的湖
                //如果所有的湖的鱼都是0的话,那么就把时间加在第一个湖,p=1;
                int maxs = 0 , p=1;
                for(int i=1;i<=k;i++)
                    if(fish[i][temp[i]+1]>maxs)
                    {
                        maxs = fish[i][temp[i]+1];
                        p=i;
                    }
                maxFish+=maxs;
                temp[p]++;
            }
            //更新最大值情况
            if(maxFish>ans)
            {
                ans=maxFish;
                memcpy(time,temp,sizeof(temp));
            }
        }
        printf("%d",time[1]*5);
        for(int i=2;i<=n;i++)
            printf(", %d",time[i]*5);
        printf("\nNumber of fish expected: %d\n\n",ans);
    }
}
时间: 2024-11-05 16:32:06

poj1042的相关文章

POJ-1042 Gone Fishing (贪心法求最佳钓鱼方案

Gone Fishing Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 28075   Accepted: 8371 Description John is going on a fishing trip. He has h hours available (1 <= h <= 16), and there are n lakes in the area (2 <= n <= 25) all reachab

黑书贪心例题之钓鱼 poj1042:Gone Fishing

总时间限制: 2000ms 内存限制: 65536kB 描述 John is going on a fishing trip. He has h hours available (1 <= h <= 16), and there are n lakes in the area (2 <= n <= 25) all reachable along a single, one-way road. John starts at lake 1, but he can finish at a

poj1042 Gone Fishing

题目来源:http://poj.org/problem?id=1042 题目大意:一个人在一个打算在编号1~n的湖里钓鱼,钓鱼是单向走的,不能往回走.给你n个湖,每个湖初始鱼的数量pi每次每个湖钓鱼后鱼的减少量di,第i个湖到第i+1湖的距离时间ti(单位是5min...),这个人可以在任何湖停止钓鱼求如何钓鱼才能才能在h小时内钓鱼量最多输出在每个湖钓鱼的时间.相同钓鱼量情况下,输出湖编号小的用时多的时间. 题目思路:用贪心+枚举即可.在枚举的大循环下,每一种枚举情况采用贪心计算出最优的钓鱼情况

基本算法之贪心算法

看了刘汝佳大牛的黑书果然很有体会,虽然很难,但是真的题题经典,一定要坚持坐下去,下面我们来说说贪心法 贪心算法即是每次选择局部最优策略进行实施,而不去考虑对今后的影响.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关. 下面来看一个题目: POJ1042 钓鱼(黑书) 链接:http://poj.org/problem?id=1042 贪心:为了不讨论在路上花费的时间,可以枚举到过的湖:比如: