Description

有\(n\)个项目,每个项目可以获得利润\(p_i\),但需要前提资本\(c_i\)才能启动。初始时你有资本\(w\),求最多\(k\)个项目的最大利润

Constraints

时间复杂度不超过\(O(nlogn)\)

Solution

这种一眼是排序+堆操作的贪心,最近品鉴得有点多了。排序按能合法操作的来,堆按所求最优的做关键字,因此是按资本排序,并用利润作为大根堆关键字

剩下的就是一个模拟过程(这点有别于反悔操作)

Code

class Solution {
public:
    int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
        auto &pro = profits;
        auto &cap = capital;
        using Tup = tuple<int, int>;
        vector<Tup> vec;
        for(size_t i = 0; i < pro.size(); ++i) {
            vec.emplace_back(cap[i], pro[i]);
        }
        sort(vec.begin(), vec.end());
        priority_queue<int> pq;
        for(size_t i = 0; i < vec.size();) {
            bool any_op = false;
            while(i < vec.size() && w >= get<0>(vec[i])) {
                pq.emplace(get<1>(vec[i]));
                any_op = true;
                i++;
            }
            if(k && !pq.empty()) {
                w += pq.top();
                pq.pop();
                any_op = true;
                k--;
            }
            if(!any_op) break;
        }
        // Note
        while(k-- && !pq.empty()) w+=pq.top(), pq.pop();
        return w;
    }
};

LeetCode-502 IPO