zoukankan      html  css  js  c++  java
  • Leetcode 502 IPO

    假设 力扣(LeetCode)即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k 个不同项目后得到最大总资本的方式。

    给你 n 个项目。对于每个项目 i ,它都有一个纯利润 profits[i] ,和启动该项目需要的最小资本 capital[i] 。

    最初,你的资本为 w 。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。

    总而言之,从给定项目中选择 最多 k 个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。

    题目链接

    样例

    示例 1:

    输入:k = 2, w = 0, profits = [1,2,3], capital = [0,1,1]
    输出:4
    解释:
    由于你的初始资本为 0,你仅可以从 0 号项目开始。
    在完成后,你将获得 1 的利润,你的总资本将变为 1。
    此时你可以选择开始 1 号或 2 号项目。
    由于你最多可以选择两个项目,所以你需要完成 2 号项目以获得最大的资本。
    因此,输出最后最大化的资本,为 0 + 1 + 3 = 4。
    

    示例 2:

    输入:k = 3, w = 0, profits = [1,2,3], capital = [0,1,2]
    输出:6
    

    思路

    使用贪心思想:假设没有k个次数限制,只需要每次找到当前能资金能够启动的项目依次添加。

    当有k个限制之后,每次寻找当前资金能够获得的最大利润,之后资金加上利润继续寻找直到k次,使用俩个优先队列存储 一个按启动资金从小到大排列 另外一个按利润从大到小排列。

    #include <bits/stdc++.h>
    using namespace std;
    
    class Solution
    {
    public:
        struct node
        {
            int pro;
            int cap;
            bool operator<(const node &b) const
            {
                return cap > b.cap;
            }
            node(int p, int c) : pro(p), cap(c)
            {
            }
        };
    
        int findMaximizedCapital(int k, int w, vector<int> &profits, vector<int> &capital)
        {
            //使用俩个优先队列
            //按启动资金从小到大排列
            priority_queue<node> nodeQ;
            for (int i = 0; i < profits.size(); i++)
            {
                node n(profits[i], capital[i]);
                nodeQ.push(n);
            }
            //按利润从大到小排列
            priority_queue<int, vector<int>, less<int>> pQ;
            while (k--)
            {
                //依次弹出小于等于当前资金的元素
                while (!nodeQ.empty() && w >= nodeQ.top().cap)
                {
                    pQ.push(nodeQ.top().pro);
                    nodeQ.pop();
                }
                //当前资金加上当前资金能获取的最大利润
                if (pQ.empty())
                {
                    break;
                }
                else
                {
                    w += pQ.top();
                    pQ.pop();
                }
            }
            return w;
        }
    };
    
    int main()
    {
        Solution s;
        vector<int> v1 = {1, 2, 3}, v2 = {0, 1, 1};
        cout << s.findMaximizedCapital(2, 0, v1, v2);
    }
    
  • 相关阅读:
    Arcgis Android 常见问题
    Arcgis Android 手动搭建开发环境
    Arcgis Android 坐标转换
    ArcGis Android 10.2.6更新文档翻译
    arcgis android 中shapefile的加载
    arcgis android 10.2.5开发环境配置
    so far so good
    做什么都要坚持,写blog也一样,
    WPF前台数据验证(红框)Validation.ErrorTemplate 附加属性
    WOSA/XFS及SP综述
  • 原文地址:https://www.cnblogs.com/dlvguo/p/15241531.html
Copyright © 2011-2022 走看看