LeetCode502.IPO

这篇博客探讨了一种利用贪心算法和大根堆解决在有限资本下最大化投资收益的问题。首先对投资门槛进行排序,并更新对应利润位置,然后使用大根堆选择能购买的项目,动态调整资本,以达到最大资本利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路: 贪心 + 大根堆
分析: 首先我们只能选择capital小于w的, 这是一个查找问题, 对此可以想到二分查找, 因此可以先对capital进行排序, 并对Profits的位置进行更新, 之后根据w会一直增大, 那么我们可以使用大根堆, 将可以购买的项目放入堆中, 选出最大值即可

class Solution {
public:

    struct Node {
        int x, y;
    };

    int binary_search(vector<Node> &v, int w) {
        // 1, 1, 1, 1, 0, 0, 0
        int l = 0, r = v.size() - 1;
        while (l != r) {
            int mid = (l + r + 1) / 2;
            if (v[mid].x <= w) l = mid;
            else r = mid - 1;
        }
        return l;
    }

    int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
        vector<Node> v_cap(capital.size(), {0, 0}); // x: 投资门槛, y: 获取利润
        auto cmp = [&](const Node &a, const Node &b){return a.x < b.x;};
        for (int i = 0; i < capital.size(); i++) v_cap[i].x = capital[i], v_cap[i].y = profits[i];
        sort(v_cap.begin(), v_cap.end(), cmp);
        if (w < v_cap[0].x) return 0; // 如果一个项目也没本法购买, 那么直接返回0
        // 这一次从哪里加入堆
        int last = 0, count = capital.size(); // last: 标记这次从哪里开始将数据放入大根堆, count表示项目的数量, 如果项目的数量小于k那么, 就跳出循环
        priority_queue<int> q;
        while (k-- && count--) {
            int pos = binary_search(v_cap, w);
            // 把之前的放入
            for (int i = last; i <= pos; i++) q.push(v_cap[i].y);
            last = pos + 1;
            if (q.empty()) continue; // 如果堆为空, 那么就从新循环
            w += q.top(); q.pop();
        }
        return w;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值