LeetCode----IPO「贪心/优先队列」

题目描述

假设 力扣(LeetCode)即将开始其 IPO。为了以更高的价格将股票卖给风险投资公司
力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。
帮助 力扣 设计完成最多 k 个不同项目后得到最大总资本的方式。
给定若干个项目。对于每个项目 i,它都有一个纯利润 Pi,并且需要最小的资本 Ci 来启动相应的项目。
最初,你有 W 资本。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。

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

示例

输入: k=2, W=0, Profits=[1,2,3], Capital=[0,1,1].
输出: 4

解释:

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

思路

贪心:优先选择最大价值、其次最小资本即可
双优先队列
大顶堆记录可以投资的项目(按价值排序),小顶堆记录不够资本投资的项目(按资本排序)
先选择投资大顶堆中的项目,当资本发生扩张时,再从小顶堆中取出可投资项目加入大顶堆

代码

// 贪心
class Solution {
    private static class Poject implements Comparable<Poject> {
        int val, cost;
        Poject(int val, int cost) {
            this.val = val;
            this.cost = cost;
        }

        @Override
        public int compareTo(Poject poject) {
            int tmp = poject.val - this.val;
            return tmp == 0 ? this.cost - poject.cost : tmp;
        }
    }
    private List<Poject> list = new ArrayList<>();
    public int findMaximizedCapital(int k, int w, int[] Profits, int[] Capital) {
        for(int i = 0; i < Profits.length; ++i) {
            list.add(new Poject(Profits[i], Capital[i]));
        }
        Collections.sort(list);
        for(int i = 0; i < k && !list.isEmpty(); ++i) {
            for(Poject poject : list) {
                if(poject.cost <= w) {
                    w += poject.val;
                    list.remove(poject);
                    break;
                }
            }
        }
        return w;
    }
}
// 双优先队列
class Solution {
    private static class Poject implements Comparable<Poject> {
        int val, cost;
        Poject(int val, int cost) {
            this.val = val;
            this.cost = cost;
        }

        @Override
        public int compareTo(Poject poject) {
            return poject.val - this.val;
        }
    }
    private Queue<Poject> maxHeap = new PriorityQueue<>();
    private Queue<Poject> minHeap = new PriorityQueue<>(new Comparator<Poject>() {
        @Override
        public int compare(Poject o1, Poject o2) {
            return o1.cost - o2.cost;
        }
    });
    public int findMaximizedCapital(int k, int w, int[] Profits, int[] Capital) {
        for(int i = 0; i < Profits.length; ++i) {
            if(w >= Capital[i]) {
                maxHeap.add(new Poject(Profits[i], Capital[i]));
            } else {
                minHeap.add(new Poject(Profits[i], Capital[i]));
            }
        }
        for(int i = 0; i < k && !maxHeap.isEmpty(); ++i) {
            w += maxHeap.poll().val;
            while(!minHeap.isEmpty() && minHeap.peek().cost <= w) {
                maxHeap.add(minHeap.poll());
            }
        }
        return w;
    }
}

原文地址:https://www.cnblogs.com/qq188380780/p/11643650.html

时间: 2024-10-17 09:45:34

LeetCode----IPO「贪心/优先队列」的相关文章

怎样将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态载入框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新.结果频繁的更新.反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

「C语言」常量和变量的表示及应用

先发布,还在修改完善中.. 在程序运行中,其值不能改变的量成为常量.在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 整型常量 即整常数,由一个或多个数字组成,可以带正负号 C语言中整型常量可用十进制.八进制和十六进制3种形式表示 十进制整数:由0~9数字组成,不能以0开始,没有前缀 八进制整数:以0为前缀,其后由0~7的数字组成,没有小数部分 十六进制整数:以0x或0X开头,其后由0~9的数字和a~f(或A~F字母组成) 另外长

poj3190Stall Reservations(贪心+优先队列)

题目链接: 啊哈哈,点我点我 思路: 首先根据挤奶时间的先后顺序排序...然后将第一头牛加入优先队列..然后就是加入优先队列的牛应该根据越早结束挤奶那么优先级更高,如果时间结束点相等,那么开始时间早的优先级高... 然后从前向后枚举.如果碰到有牛的挤奶时间的开始值大于优先队列的首部的结束值,那么说明这两头牛可以一起公用一个挤奶房..然后从优先队列中删除这头牛..那么这个问题就得到解决了... 题目: Language: Default Stall Reservations Time Limit:

Chrome 扩展 Stylish :给不喜欢某个网站一键「换肤」

原文地址:http://whosmall.com/?post=419 本文标签: Chrome扩展 Chrome浏览器 Chrome插件 Chrome扩展Stylish Stylish是什么 Stylish 是什么? 开门见山,Stylish 的作用是,它可以把百度首页变成这样: 它还能把知乎「拍扁」,让微博网页版变得简洁无比,让 Feedly 用上Material Design-- 这个神奇的 Stylish实际上是一个浏览器插件,适用于 Chrome,Firefox,Opera 以及 Saf

3D高科技投影 麦可「复活登台」幕后

美国告示牌音乐颁奖典礼,日前在赌城盛大举行,主办单位利用高科技投影技术,让麦可杰克森「复活」登台表演,3D全像投影,加上影片与真人舞群无缝接轨,高科技让过世的大明星彷佛活了过来. 流行乐天王麦可杰克森死而复生,过世将近5年的他,又现身在今年美国告示牌音乐颁奖典礼上,金光闪闪现身舞台中央,麦可杰克森回来了,再现招牌的动感舞步,流露巨星风采,主办单位利用3D全像摄影技术,秘密制作了半年多,把他带回到世人眼前. 特效专家:「观众在告示牌典礼上看到的是,麦可的头部数字影像,连接到一名演员身上,我们实时捕

「Maven Tips」(一)自动更新jar包

maven中手动去更新jar包,是一件比较繁琐麻烦的事情,使用Range Dependency则可以省去这一步骤. 部分jar包可能会自动升级到beat版本! 官方说明文档:Dependency Version Ranges Range Meaning (,1.0] version ≤ 1.0 1.0 固定1.0版本 [1.0]   [1.2,1.3] 1.2 ≤ version ≤ 1.3 [1.0,2.0) 1.0 ≤ version ≤ 2.0 [1.5,) version ≥ 1.5 (

Linux 小知识翻译 - 「桌面环境」

这次聊聊桌面环境. 上次聊了 X Window System 相关的内容,虽然令人意外,但X Window System 和桌面环境不是一回事.请大家稍微考虑一下. X Window System 是指提供GUI环境的软件或者协议.与之相对,「桌面环境」是指工具栏,图标,窗口管理器,桌面管理器等等各式各样软件组合起来的GUI软件包. 换句话说,就是「使用桌面所必需的软件的集合」. 有名的桌面环境有「GNOME」和「KDE」.最近,很多Linux的发行版并不关心使用的桌面环境是「GNOME」还是「

王堅:「資料」改變了商業模式,運算能力決定企業的競爭力

阿里巴巴集團技術委員會主席.阿里巴巴的雲端建立者,王堅博士於上週來到台灣,出席了阿里巴巴針對台灣創業者舉辦的一場大會時,發表了他對於雲端運算.大數據以及人工智慧的一些看法以及建議. 由於是針對創業者的場合,王堅針對現在創業者最注意的四個趨勢:網際網路.大數據.雲端運算和人工智慧提出了建議.王堅表示,當初阿里巴巴談電子商務的時候,並不是大家想的簡單的把商店搬到網路上如此而已,而是從「相信網際網路是未來商業的基礎設施」這個基本觀念出發.而現在,你可以看到當初有這樣想法的網路公司,現在都已經成長為科技

AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ

#2057. 「TJOI / HEOI2016」游戏 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define maxn 2000005 int n,m,s,t,que[maxn],deep[maxn],toth,totl,F[max