IPO问题,最高利润

代价数组 cost[]
利润数组 profit[]
最多做 k 个项目,且项目不能并行做,也即一次之能做一个项目。也不能重复做相同项目
给出初始资金 w,求最后最大收益

------- 步骤 -------

初始化 所有项目, 项目里面包含 花费 cost 和利润 profit
准备一个小根堆,按照花费来建立,花费低的来到小根堆的头部
有初始资金 w,依次弹出小根堆的头部,但是要保证弹出的花费低于 w
将所有弹出的项目,依次按照利润 profit 排成大根堆 ----- 小根堆里是当前做不了的项目
在大根堆里面拿出头项目,这个项目就是当前可做项目中收益最高的项目,做完这个项目
由于做完了一个项目,资金变多了 w = w + p1
再在小根堆里面弹出项目,放到大根堆,再次弹出,循环流程……

package 贪心;

import java.util.Comparator;
import java.util.PriorityQueue;

public class MostProfitIPO {

public static int findMaximizedCapital(int k, int w, int[] profits, int[] costs) {
	Node[] nodes = new Node[profits.length];
	for(int i=0;i<nodes.length;i++) {
		nodes[i] = new Node(profits[i], costs[i]);
	}
	PriorityQueue<Node> minCostHeap = new PriorityQueue<Node>(new MinCostComparator());
	PriorityQueue<Node> maxProfitHeap = new PriorityQueue<Node>(new MaxProfitComparator());
	
	//节点全部加入 代价堆
	for(int i=0;i<nodes.length;i++) {
		minCostHeap.add(nodes[i]);
	}
	
	for(int i=0;i<k;i++) {
		while(!minCostHeap.isEmpty() && minCostHeap.peek().cost <= w) {
			maxProfitHeap.add(minCostHeap.poll());
		}
		if(maxProfitHeap.isEmpty()) {
			return w;
		}
		w = w + maxProfitHeap.poll().profit;
	}
	
	return w;
}

}

class Node{
int profit;
int cost;

public Node(int profig, int cost) {
	this.profit = profig;
	this.cost = cost;
}

}

class MinCostComparator implements Comparator {
public int compare(Node o1, Node o2) {
return o1.cost - o2.cost;
}
}

class MaxProfitComparator implements Comparator {
public int compare(Node o1, Node o2) {
return o2.profit - o1.profit;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值