【LeetCode IPO】貪心&&PriorityQueue&&重寫Comparator的應用

問題鏈接:https://leetcode-cn.com/problems/ipo/

假設 LeetCode 即將開始其 IPO。爲了以更高的價格將股票賣給風險投資公司,LeetCode希望在 IPO 之前開展一些項目以增加其資本。
由於資源有限,它只能在 IPO 之前完成最多 k 個不同的項目。幫助 LeetCode 設計完成最多 k 個不同項目後得到最大總資本的方式。
給定若干個項目。對於每個項目 i,它都有一個純利潤 Pi,並且需要最小的資本 Ci 來啓動相應的項目。
最初,你有 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。

注意:

    假設所有輸入數字都是非負整數。
    表示利潤和資本的數組的長度不超過 50000。
    答案保證在 32 位有符號整數範圍內。


思路:首先定義出一個結構,結構中包含利潤和成本,然後按照成本最低構建一個小根堆,按照利潤最高構建一個大根堆,依次將小根堆中成本小於等於當前資金的項目都添加到大根堆去,然後依次將大根堆中的項目彈出,獲取利潤即可


代碼:

public class 貪心_綜合應用_獲得最大資本 {
	static class Project
	{
		int profits,capital;
		public Project(int p,int c)
		{
			this.profits = p;
			this.capital = c;
		}
	}
	public static class myMinCompare implements Comparator<Project>
	{
		@Override
		public int compare(Project o1, Project o2) {
			return o1.capital-o2.capital;
		}
	}
	public static class myMaxCompare implements Comparator<Project>
	{
		@Override
		public int compare(Project o1, Project o2) {
			return o2.profits-o1.profits;
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int k,w;
		k = in.nextInt();//最多開展k個項目
		w = in.nextInt();//初始資金
		int profits[] = new int[] {1,2,3};
		int capital[] = new int[] {0,1,1};
		Project pj[] = new Project[profits.length];
		
		PriorityQueue<Project> minQueue = new PriorityQueue<Project>(new myMinCompare());
		PriorityQueue<Project> maxQueue = new PriorityQueue<Project>(new myMaxCompare());
		for(int i=0;i<profits.length;i++)
		{
			pj[i] = new Project(profits[i],capital[i]);
		}
		for(Project i:pj)//把所有項目放進小根堆,並按成本從低到高依次出隊
		{
			minQueue.add(i);
		}
		for(int i=0;i<k;i++)//最多k個項目
		{
			while(!minQueue.isEmpty()&&minQueue.peek().capital<=w)
				maxQueue.add(minQueue.poll());//把能啓動的項目放進大根堆,並按利潤從高到低準備出隊列
			if(!maxQueue.isEmpty())//說明當前有資金w能啓動的項目
			{
				w += maxQueue.poll().profits;
			}
		}
		System.out.println(w);
		
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章