• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
山不在高,有金则名!
博客园    首页    新随笔    联系   管理    订阅  订阅

1373:鱼塘钓鱼(fishing)

 

【题目描述】

有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表:

鱼塘编号每1分钟能钓到的鱼的数量(1..1000)每1分钟能钓鱼数的减少量(1..100)当前鱼塘到下一个相邻鱼塘需要的时间(单位:分钟)11023214453206441654593鱼塘编号12345每1分钟能钓到的鱼的数量(1..1000)101420169每1分钟能钓鱼数的减少量(1..100)24653当前鱼塘到下一个相邻鱼塘需要的时间(单位:分钟)3544

即:在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼,……,第5分钟以后再也钓不到鱼了。从第1个鱼塘到第2个鱼塘需要3分钟,从第2个鱼塘到第3个鱼塘需要5分钟,……

给出一个截止时间T(T<1000),设计一个钓鱼方案,从第1个鱼塘出发,希望能钓到最多的鱼。

假设能钓到鱼的数量仅和已钓鱼的次数有关,且每次钓鱼的时间都是整数分钟。

【输入】

共5行,分别表示:

第1行为N;

第2行为第1分钟各个鱼塘能钓到的鱼的数量,每个数据之间用一空格隔开;

第3行为每过1分钟各个鱼塘钓鱼数的减少量,每个数据之间用一空格隔开;

第4行为当前鱼塘到下一个相邻鱼塘需要的时间;

第5行为截止时间T。

【输出】

一个整数(不超过231−1231−1),表示你的方案能钓到的最多的鱼。

【输入样例】

5
10 14 20 16 9
2 4 6 5 3
3 5 4 4
14

【输出样例】

76

#include <bits/stdc++.h>
using namespace std;

struct Node {
    int num; // 鱼的数量
    int idx; // 鱼塘编号
    Node(int n, int i)
    { // 构造函数
        num = n, idx = i;
    }

    friend bool operator<(const Node &a, const Node &b)
    { // 友元函数,大根堆排序(小在前)
        if (a.num == b.num) {
            return a.idx > b.idx;
        } else {
            return a.num < b.num;
        }
    }
};

int main()
{
    // freopen("in.txt", "r", stdin);
    int n;
    cin >> n;
    vector<int> a(n + 1); // 鱼量
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    vector<int> b(n + 1); // 减量
    for (int i = 1; i <= n; i++) {
        cin >> b[i];
    }
    vector<int> c(n + 1); // 时间
    for (int i = 1; i < n; i++) {
        cin >> c[i];
    }
    int tt; // 可用的总时间
    cin >> tt;

    int tu = 0; // 已用时间
    int mx = 0; // 最优方案
    for (int k = 1; k <= n; k++) { // 点位
        priority_queue<Node> q; // 优先队列
        for (int i = 1; i <= k; i++) {
            q.push(Node(a[i], i));
            // printf("a[%d]=%d ", i, a[i]);
        }
        int sum = 0; // 和
        // printf("\nt=%d: ", tt - tu); // 剩余时间
        for (int t = tt - tu; t > 0 && !q.empty();
             t--) { // 剩余时间
            Node top = q.top(); // 贪心
            q.pop(); // 弹出
            // printf("[%d]=%d,", top.idx, top.num);
            sum += top.num; // 累加
            top.num -= b[top.idx];
            if (top.num > 0) {
                q.push(top);
            }
        }
        // printf("s=%d\n", sum);
        if (mx < sum) {
            mx = sum;
        }
        tu += c[k]; // 时间累加
    }
    cout << mx << endl;
    return 0;
}

  

posted @ 2021-11-21 14:06  杭州山不高  阅读(355)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3