POJ 1042 Gone Fishing

题意:一个人要在n个湖中钓鱼,湖之间的路径是单向的,只能走1->2->3->...->n这一条线路,告诉你每个湖中一开始能钓到鱼的初始值,和每钓5分钟就减少的数量,以及湖之间的距离,问用h小时最多钓多少鱼。鱼的数量不会增加,而且如果不钓鱼的话鱼的数量不会减少,如果有多个答案,输出在小号的湖上花费时间最多的答案。

解法:贪心。枚举在前i个湖里钓鱼,那么走的路程就是一定的,用总时间减去走过的时间,剩下的时间每5分钟为一个单位,选鱼最多的湖钓,然后更新湖里鱼的数量。据说dp也可以做,大概想到了但是觉得好麻烦没有写……以下是我的想法……欢迎指正:可以用一个结构体dp数组,结构体里存鱼数和时间,dp[i][j]表示在前i个湖里钓鱼用了j时间时钓到的鱼数和在第i个湖用的时间,应该就可以了吧……

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
struct node
{
    int f, d, id;
    bool operator < (const node &tmp) const
    {
        if(f == tmp.f) return id > tmp.id;
        else return f < tmp.f;
    }
}l[30];
int sum[30];
int ans[30][30];
int main()
{
    int n, h;
    while(~scanf("%d", &n) && n)
    {
        scanf("%d", &h);
        memset(sum, 0, sizeof sum);
        memset(ans, 0, sizeof ans);
        for(int i = 1; i <= n; i++)
        {
            scanf("%d", &l[i].f);
            l[i].id = i;
        }
        for(int i = 1; i <= n; i++)
            scanf("%d", &l[i].d);
        for(int i = 2; i <= n; i++)
        {
            int x;
            scanf("%d", &x);
            sum[i] = sum[i - 1] + x;
        }
        int st = h * 12;
        int maxn = -1, pos = 0;
        for(int i = 1; i <= n; i++)
        {
            priority_queue <node> q;
            for(int j = 1; j <= i; j++)
                q.push(l[j]);
            int res = 0;
            for(int j = 0; j < st - sum[i]; j++)
            {
                node tmp = q.top();
                q.pop();
                res += tmp.f;
                ans[i][tmp.id]++;
                q.push((node){max(0, tmp.f - tmp.d), tmp.d, tmp.id});
            }
            if(res > maxn)
            {
                maxn = res;
                pos = i;
            }
        }
        for(int i = 1; i <= n; i++)
        {
            if(i != 1) printf(", ");
            printf("%d", ans[pos][i] * 5);
        }
        puts("");
        printf("Number of fish expected: %d\n\n", maxn);
    }
    return 0;
}

  

时间: 2024-10-28 07:06:40

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#贪心

(- ̄▽ ̄)-* #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:每轮贪心

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

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

Gone Fishing POJ - 1042

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 any lake he wants. He can only t

贪心算法 -- gone fishing

poj 1042 gone fishing 题目要求: 由有n个湖, 按照顺序排列,一个人从第一个湖向最后一个湖行进(方向只能从湖0到湖n-1),途中可以在湖中钓鱼.在每个湖中钓鱼时,开始的5分钟内可以钓到 f[i] 条,之后每5分钟钓到的鱼数目递减 d[i] ,且每两个相邻的湖的距离 t[i] 给出(t[i] 表示 由第 i 个湖向第 i + 1个湖行进在路上花费5分钟的倍数的时间, 即如果t[3] = 4,则表示从第三个湖向第四个湖行进需要花费20分钟). 现给定总时间h 小时,求出在每个湖

acm刷题记录

我感觉毫无目的地刷题没有意义,便记录每周的刷题,以此激励自己! ----------6.6-------- [vijos1055]奶牛浴场                                      最大化               推荐IOI论文<浅谈用极大化思想解决最大子矩形问题> codeforces 679B - Bear and Tower of Cubes      xjb搞 codeforces  680A - Bear and Five Cards       

HLJU 1046: 钓鱼(数据增强版) (贪心+优化)

1046: 钓鱼(数据增强版) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 11  Solved: 3 [Submit][Status][Web Board] Description 在一条水平路边,有n个钓鱼湖.从右到左编号为1.2.3--.n. 佳佳有H个小时的空余时间.他希望用这些时间尽可能多的钓鱼.他从湖1出发,向右走,有选择的在一些湖边停留一定时间钓鱼.最后在某一湖边结束钓鱼. 佳佳測出从第i个湖到第i+1个湖须要走Ti分钟的路,还測