日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法之花费铜板最小和利润最大题目

發布時間:2024/2/28 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法之花费铜板最小和利润最大题目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構與算法之花費銅板最小和利潤最大題目


目錄

  • 花費銅板最小
  • 獲得利潤最大

  • 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; // < 0 o1 < o2 負數}}public static class MaxheapComparator implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1; // < o2 < o1}}public static void main(String[] args) {// solutionint[] arr = { 6, 7, 8, 9 };System.out.println(lessMoney(arr));int[] arrForHeap = { 3, 5, 2, 7, 0, 1, 6, 4 };// min heapPriorityQueue<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();// min heap use ComparatorPriorityQueue<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();// max heap use ComparatorPriorityQueue<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;}}

    總結

    以上是生活随笔為你收集整理的数据结构与算法之花费铜板最小和利润最大题目的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。