生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法之花费铜板最小和利润最大题目
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據結構與算法之花費銅板最小和利潤最大題目
目錄
花費銅板最小獲得利潤最大
1. 花費銅板最小
題目描述
注:PriorityQueue(優先隊列),一個基于優先級堆的無界優先級隊列。實際上是一個堆(不指定Comparator時默認是小頂堆),通過傳入自定義的compara函數可以實現大頂堆。
思路
生成優先級隊列,默認是最小堆創建sum記錄總和,cur表示每次彈出兩個之和當pQ.size()>1時,從中取兩個相加,用sum記錄,cur再放回堆。 代碼實現
import java
.util
.Comparator
;
import java
.util
.PriorityQueue
;public class Code_02_Less_Money {public static int lessMoney(int[] arr
) {PriorityQueue
<Integer> pQ
= new PriorityQueue<>();for (int i
= 0; i
< arr
.length
; i
++) {pQ
.add(arr
[i
]);}int sum
= 0;int cur
= 0;while (pQ
.size() > 1) {cur
= pQ
.poll() + pQ
.poll();sum
+= cur
;pQ
.add(cur
);}return sum
;}public static class MinheapComparator implements Comparator<Integer> {@Overridepublic int compare(Integer o1
, Integer o2
) {return o1
- o2
; }}public static class MaxheapComparator implements Comparator<Integer> {@Overridepublic int compare(Integer o1
, Integer o2
) {return o2
- o1
; }}public static void main(String
[] args
) {int[] arr
= { 6, 7, 8, 9 };System
.out
.println(lessMoney(arr
));int[] arrForHeap
= { 3, 5, 2, 7, 0, 1, 6, 4 };PriorityQueue
<Integer> minQ1
= new PriorityQueue<>();for (int i
= 0; i
< arrForHeap
.length
; i
++) {minQ1
.add(arrForHeap
[i
]);}while (!minQ1
.isEmpty()) {System
.out
.print(minQ1
.poll() + " ");}System
.out
.println();PriorityQueue
<Integer> minQ2
= new PriorityQueue<>(new MinheapComparator());for (int i
= 0; i
< arrForHeap
.length
; i
++) {minQ2
.add(arrForHeap
[i
]);}while (!minQ2
.isEmpty()) {System
.out
.print(minQ2
.poll() + " ");}System
.out
.println();PriorityQueue
<Integer> maxQ
= new PriorityQueue<>(new MaxheapComparator());for (int i
= 0; i
< arrForHeap
.length
; i
++) {maxQ
.add(arrForHeap
[i
]);}while (!maxQ
.isEmpty()) {System
.out
.print(maxQ
.poll() + " ");}}
}
2. 獲得利潤最大
題目描述
思路
創建好所有的項目,加入Node[]準備一個存放花費的小根堆,和準備一個利潤的大根堆。將所有的項目放入小根堆for循環表示做項目次數不超過k,如果小根堆的堆頂的錢小于當前的錢,說明項目可以做,加入利潤大根堆如果大根堆空了,說明項目做不下去了,返回當前的錢數M每次循環需要當前的錢加上做當前項目的利潤。 代碼實現
import java
.util
.Comparator
;
import java
.util
.PriorityQueue
;public class Code_03_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> {@Overridepublic int compare(Node o1
, Node o2
) {return o1
.c
- o2
.c
;}}public static class MaxProfitComparator implements Comparator<Node> {@Overridepublic int compare(Node o1
, Node o2
) {return o2
.p
- o1
.p
;}}public static int findMaximizedCapital(int k
, int W
, int[] Profits
, int[] Capital
) {Node
[] nodes
= new Node[Profits
.length
];for (int i
= 0; i
< Profits
.length
; i
++) {nodes
[i
] = new Node(Profits
[i
], Capital
[i
]);}PriorityQueue
<Node> minCostQ
= new PriorityQueue<>(new MinCostComparator());PriorityQueue
<Node> maxProfitQ
= new PriorityQueue<>(new MaxProfitComparator());for (int i
= 0; i
< nodes
.length
; i
++) {minCostQ
.add(nodes
[i
]);}for (int i
= 0; i
< k
; i
++) {while (!minCostQ
.isEmpty() && minCostQ
.peek().c
<= W
) {maxProfitQ
.add(minCostQ
.poll());}if (maxProfitQ
.isEmpty()) {return W
;}W
+= maxProfitQ
.poll().p
;}return W
;}}
總結
以上是生活随笔為你收集整理的数据结构与算法之花费铜板最小和利润最大题目的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。