poj1042 Gone Fishing

题目链接
题意
做法

反省
1.理解“瞬移”的意思。
2.恰当使用c++ stl和数据结构,简化代码。
3.有时候题目思路正确,并不需要考虑到太多的特例,吓唬自己。

#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;

struct
Lake {
    int id, f, d;

    // 按湖里鱼数从大到小排,需重载 '<'
    // 鱼数相等,id小的湖优先
    friend bool operator < (Lake a, Lake b) {  // friend不能够少
        if( a.f == b.f ) {
            return a.id > b.id;
        }
        return a.f < b.f;
    }
};

#define maxn 30
Lake lake[maxn];
Lake temp;
int t[maxn];  // 每两池塘之间的路径长度
int lake_fishing_time[maxn][maxn];  // [i][j]: 以某个湖i为终点,在每个湖j钓鱼的时间

int
main() {
    int n, h, ans, maxans, maxk, t_on_road, t_on_fishing, i, j;

    while( scanf("%d", &n) && n ) {
        scanf("%d", &h);
        h *= 12;  // 1小时有12个5分钟
        for( i = 1; i <= n; i++ ) {
            scanf("%d", &lake[i].f);
            lake[i].id = i;
        }
        for( i = 1; i <= n; i++ ) {
            scanf("%d", &lake[i].d);
        }
        for( i = 1; i <= n - 1; i++ ) {
            scanf("%d", &t[i]);
        }

        memset(lake_fishing_time, 0, sizeof(lake_fishing_time));
        maxans = 0;
        maxk = 1;
        for( i = 1; i <= n; i++ ) {  // 枚举所有湖为终点的情况
            t_on_road = 0;
            for( j = 1; j < i; j++ ) {  // j < i,在第一个湖钓鱼不需要走路
                t_on_road += t[j];
            }

            priority_queue <Lake> pq;

            for( j = 1; j <= i; j++ ) {
                pq.push(lake[j]);
            }
            ans = 0;
            t_on_fishing = h - t_on_road;
            for( j = 1; j <= t_on_fishing; j++ ) {
                temp = pq.top();
                pq.pop();
                ans += temp.f;
                lake_fishing_time[i][temp.id] += 5;
                pq.push(Lake{temp.id, max(temp.f - temp.d, 0), temp.d});
            }
            if( ans > maxans ) {
                maxans = ans;
                maxk = i;
            }
        }
        for( i = 1; i <= n - 1; i++ ) {
            printf("%d, ", lake_fishing_time[maxk][i]);
        }
        printf("%d\n", lake_fishing_time[maxk][n]);
        printf("Number of fish expected: %d\n\n", maxans);
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值