• 1373:鱼塘钓鱼(fishing)


     

    【题目描述】

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

    11..100011..10011023214453206441654593鱼塘编号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。

    【输出】

    一个整数(不超过2311231−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;
    }
    

      

  • 相关阅读:
    一个好用的web甘特图
    应用ExcelPackage导出Excel
    Base64中文不能加密问题
    Sql Server存储过程和函数浅谈
    .NET反编译之Reflector基础示例
    NPOI导出数据到Excel
    twitter接口开发
    Nginx基本属性配置详解
    ssh-keygen创建证书
    asp.net core 设置默认文档index.html
  • 原文地址:https://www.cnblogs.com/gaojs/p/15584317.html
Copyright © 2020-2023  润新知