• T1373:鱼塘钓鱼(fishing)


    原题链接:1373:鱼塘钓鱼(fishing)

    解题思路:

    由于在走路时,鱼的数量不会减少,那我们此时可以先减去路上可能花掉的时间,用剩下的时间来找最多的鱼,然后从左向右走,k枚举能到达的最远的鱼塘,然后开一个大根堆选出最多能选的鱼,当然别忘了每次减去路上的花费(只走一次);
    大根堆的关键字用num[i] 与 i ;

    代码如下:

    #include<iostream>
    #include<queue>
    using namespace std;
    typedef pair<int, int> pr;
    //pair表示先按照第一个元素降序排序,第一个元素相等时按照第二个元素降序排序
    int num[110], reduce[110], nxt[110];
    priority_queue<pr> q;
    int main(){
        int n, deadline, t1 = 0, ans, maxn = -1;
        cin >> n;
        for(int i = 1; i <= n; i++) cin >> num[i];
        for(int i = 1; i <= n; i++) cin >> reduce[i];
        for(int i = 1; i < n; i++)  cin >> nxt[i];
        cin >> deadline;
    
        for(int k = 1; k <= n; k++){      //枚举最远走到的池塘的编号
            int tim = deadline - t1;    //计算剩余时间
            ans = 0;
            for(int i = 1; i <= k; i++){    //收集能够钓鱼的池塘的资料
                q.push(make_pair(num[i], i));
            }
            while(q.top().first > 0 && tim > 0){
                pr hp = q.top();
                q.pop();
                ans += hp.first;    //贪心选取鱼最多的池塘
                hp.first -= reduce[hp.second];    //修改鱼的数量
                q.push(hp);
                tim--;    ////剩余时间变少
            }
            if(maxn < ans)   maxn = ans;    //刷新最优解
            t1 += nxt[k];    //累计走路需要的时间
        }
        cout << maxn << endl;
        return 0;
    }
    鱼塘钓鱼

    注意点:

    1. pair的用法(按照第一个元素降序排序,第一个元素相等时按照第二个元素降序排序)
    2. 放入容器时,用make_pair();

     

  • 相关阅读:
    online_judge_1489
    MybatisPlus 快速开始
    Markdown 基本语法
    python2与python3的区别(1)
    这是我的第一篇博客
    vue 渲染函数&jsx
    计算机进行小数运算出错的原因0.2 + 0.1 = 0.30000000000000004
    最流行的高级语言
    v-cli脚手架
    vue mixins组件复用的几种方式
  • 原文地址:https://www.cnblogs.com/zoom1109/p/11269562.html
Copyright © 2020-2023  润新知