输入:正数数组costs
正数数组profits
正数k
正数m
含义:
costs[i]表示i号项目的花费(成本)
profits[i]表示i号项目的利润
k表示你只能串行的做k个项目
m表示你初始的资金
说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个项目
输出:你最后获得的最大钱数。

解题思路:准备一个小根堆和一个大根堆,小根堆是按照成本排序。将小根堆<=M的项目弹出到大根堆(大根堆按照利润排序)。然后完成大根堆最上面的项目更新本金。
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
public class IPO{
public static class Node{
public int p;
public int c;
public Node(int p,int c){
this.p = p;
this.c = c;
}
}
public static class MinCostComparator implements Comparator<Node>{
public int compare(Node o1,Node o2){
return o1.c - o2.c;
}
}
public static class MaxProfitComparator implements Comparator<Node>{
public int compare(Node o1 , Node o2){
return o2.p - o1.p;
}
}
public static int findMaxCapital(int k,int w,int[] Profits,int[] Capital){
PriorityQueue<Node> minCostQ = new PriorityQueue<>(new MinCostComparator());
PriorityQueue<Node> maxProfitQ = new PriorityQueue<>(new MaxProfitComparator());
for(int i = 0 ; i < Profits.length; i++){
minCostQ.add(new Node(Profits[i], Capital[i]));//按照成本从小到大放入小根堆
}
for(int i = 0 ; i < k; i++){//进行k轮
//能力所及的项目全解锁
while(!minCostQ.isEmpty() && minCostQ.peek().c <= w){
maxProfitQ.add(minCostQ.poll());
}
if(minCostQ.isEmpty()){
return w;
}
w += maxProfitQ.poll().p;
}
return w;
}
}
5667

被折叠的 条评论
为什么被折叠?



