POJ 1042 Gone Fishing#贪心

(~ ̄▽ ̄)~*

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int N=30;
int n,h,H;//H:记录原本有多少小时的时间;h:贪心的时候,防止H被修改
int res[N],RES[N];//res[]:贪心的时候保存结果;RES[]:用于记录最终结果
int maxn,sum;//maxn:保存最终结果,即捕到的鱼最大值;sum:每轮贪心的时候,用来保存鱼最大值

struct ff
{
    int f,d,t;//f:第i个湖里原本有的鱼数,d:第i个湖被捕过之后的鱼数,t:从第i-1到第i个湖需要的时间
};
ff f[N],F[N];

int main()
{
    while(scanf("%d",&n)&&n)
    {
        memset(RES,0,sizeof(RES));
        maxn=0;
        scanf("%d",&H);
        H*=12; //以5min为单位,输出结果的时候,记得乘以5
        RES[0]=H;//赋初值H,因为有可能1……n-1湖都没有鱼,时间就都花在第一个湖了
        for(int i=0;i<n;i++)
            scanf("%d",&F[i].f);
        for(int i=0;i<n;i++)
            scanf("%d",&F[i].d);
        for(int i=1;i<n;i++)
            scanf("%d",&F[i].t);

        for(int k=0;k<n;k++)
        {//在第0到第k个湖之间捕鱼
            h=H;
            sum=0;
            memset(res,0,sizeof(res));
            for(int i=0;i<n;i++)
                f[i].f=F[i].f;//避免F[]被修改
            for(int i=1;i<=k;i++)
                h-=F[i].t; //把到第k个湖之前所用的时间全部减去,剩下的时间来捕鱼
            if(h<=0) break;

            while(h--)
            {//只要有时间,每次都去鱼最多的湖抓鱼(贪心)
                int index=0;
                for(int i=1;i<=k;i++)
                    if(f[i].f>f[index].f)
                        index=i;
                sum+=f[index].f;
                f[index].f-=F[index].d;//第index个湖被捕之后,就会少掉d条鱼,要更新f[].f值
                if(f[index].f<0)
                    f[index].f=0;//还要注意避免负值
                res[index]++;//只要在第index个湖捕鱼,那么在第index个湖就花去了时间1(单位为/5min)
            }
            if(sum>maxn)
            {//更新最大值maxn,找到最优的状态,把数据记录在RES[]中,因为res[]会清零并用于下一轮的记录
                maxn=sum;
                for(int i=0;i<=k;i++)
                    RES[i]=res[i];
            }
        }
        for(int i=0;i<n-1;i++)
            printf("%d, ",RES[i]*5);//记得*5
        printf("%d\n",RES[n-1]*5);//记得*5
        printf("Number of fish expected: %d\n\n",maxn);
    }
    return 0;
}
时间: 2024-07-28 22:40:46

POJ 1042 Gone Fishing#贪心的相关文章

POJ 1042 Gone Fishing (贪心)(刘汝佳黑书)

Gone Fishing Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 30281   Accepted: 9124 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

NYOJ 30 &amp;&amp; POJ 1042 Gone Fishing(枚举+贪心)

[题目链接]:Click here~~ [题目大意]: 一个人去钓鱼,在一条单向路上的旁边有n个湖,并且从湖i到湖i+1需要ti的时间,每个湖里面有fi条鱼,每钓一次鱼,鱼会减少di条.在给定时间T内,问如何才能使钓的鱼最多,并记录在各个湖上停留的时间. [解题思路] 此题细节处理好多麻烦,一定要认真看清题意,POJ WA了无数遍,纠结一天.参考了别人的题解,思路如下: 首先须注意的一点是,John只能向前走,返回的话只会增加John在路上的时间,因而减少他钓鱼的时间.因此此题解题步骤如下: 1

贪心/poj 1042 Gone Fishing

1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 struct node 5 { 6 int d; 7 int fish; 8 int ans; 9 }; 10 node a[30],b[30]; 11 int t[30]; 12 int n,h,sum; 13 int main() 14 { 15 scanf("%d",&n); 16 while (n!=0) 17 { 18

poj -- 1042 Gone Fishing(枚举+贪心)

题意: John现有h个小时的空闲时间,他打算去钓鱼.钓鱼的地方共有n个湖,所有的湖沿着一条单向路顺序排列(John每在一个湖钓完鱼后,他只能走到下一个湖继续钓),John必须从1号湖开始钓起,但是他可以在任何一个湖结束他此次钓鱼的行程.此题以5分钟作为单位时间,John在每个湖中每5分钟钓的鱼数随时间的增长而线性递减.每个湖中头5分钟可以钓到的鱼数用fi表示,每个湖中相邻5分钟钓鱼数的减少量用di表示,John从任意一个湖走到它下一个湖的时间用ti表示.求一种方案,使得John在有限的h小时中

POJ 1042 Gone Fishing

题意:一个人要在n个湖中钓鱼,湖之间的路径是单向的,只能走1->2->3->...->n这一条线路,告诉你每个湖中一开始能钓到鱼的初始值,和每钓5分钟就减少的数量,以及湖之间的距离,问用h小时最多钓多少鱼.鱼的数量不会增加,而且如果不钓鱼的话鱼的数量不会减少,如果有多个答案,输出在小号的湖上花费时间最多的答案. 解法:贪心.枚举在前i个湖里钓鱼,那么走的路程就是一定的,用总时间减去走过的时间,剩下的时间每5分钟为一个单位,选鱼最多的湖钓,然后更新湖里鱼的数量.据说dp也可以做,大概

poj 2431 Expedition (贪心+优先队列)

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6890   Accepted: 2065 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to

POJ 3085 Quick Change (贪心)

Quick Change Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5801   Accepted: 4175 Description J.P. Flathead's Grocery Store hires cheap labor to man the checkout stations. The people he hires (usually high school kids) often make mistak

POJ 1659 Frogs&#39; Neighborhood (贪心)

题意:中文题. 析:贪心策略,先让邻居多的选,选的时候也尽量选邻居多的. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring>

uva757 - Gone Fishing(贪心)

题目:uva757 - Gone Fishing(贪心) 题目大意:有N个湖泊只有一条通路将这些湖泊相连.每个湖泊都会给最开始5分钟间隔内可以调到的鱼(f),然后给每过5分钟减少的鱼的数量(d),如果当前的鱼少于等于减少的数量,说明在下个5分钟没有鱼.还有过每条道路的所要耗费的时间(N-1),时间都是以5分钟为单位的.渔者可以在任意一个湖泊钓鱼,但是起始位置是在湖泊1.问H小时后,渔者怎样合理的在每个湖泊分配时间,可以得到的鱼最多.如果得到最多的鱼的方式有多种,则取在前面的湖泊耗时最久的那一种.