zoukankan      html  css  js  c++  java
  • 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();

     

  • 相关阅读:
    Swift 3 中的访问控制 open public internal fileprivate private
    swift3.0 创建一个app引导页面
    cocoapods安装及常用命令
    swift 多线程及GCD
    swift 键盘属性与事件
    [bzoj2588] Count on a tree
    [JSOI2007] 文本生成器
    18.09.22模拟赛T2 历史
    [USACO18OPEN] Talent Show
    [国家集训队] 整数的lqp拆分
  • 原文地址:https://www.cnblogs.com/zoom1109/p/11269562.html
Copyright © 2011-2022 走看看