1. 程式人生 > 其它 >PAT (Basic Level) 1020 月餅(貪心)

PAT (Basic Level) 1020 月餅(貪心)

1020 月餅 (25 分)

月餅是中國人在中秋佳節時吃的一種傳統食品,不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量、總售價、以及市場的最大需求量,請你計算可以獲得的最大收益是多少。

注意:銷售時允許取出一部分庫存。樣例給出的情形是這樣的:假如我們有 3 種月餅,其庫存量分別為 18、15、10 萬噸,總售價分別為 75、72、45 億元。如果市場的最大需求量只有 20 萬噸,那麼我們最大收益策略應該是賣出全部 15 萬噸第 2 種月餅、以及 5 萬噸第 3 種月餅,獲得 72 + 45/2 = 94.5(億元)。

輸入格式:

每個輸入包含一個測試用例。每個測試用例先給出一個不超過 1000 的正整數N表示月餅的種類數、以及不超過 500(以萬噸為單位)的正整數D表示市場最大需求量。隨後一行給出N個正數表示每種月餅的庫存量(以萬噸為單位);最後一行給出N個正數表示每種月餅的總售價(以億元為單位)。數字間以空格分隔。

輸出格式:

對每組測試用例,在一行中輸出最大收益,以億元為單位並精確到小數點後 2 位。

輸入樣例:

3 20
18 15 10
75 72 45
結尾無空行

輸出樣例:

94.50
結尾無空行
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.PriorityQueue; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String s = reader.readLine(); String[] s1 = s.split(" "); double N = Double.parseDouble(s1[0]);//
月餅種類 double D = Double.parseDouble(s1[1]);//需求量 String s2 = reader.readLine(); String[] number = s2.split(" "); String s4 = reader.readLine(); String[] prices = s4.split(" "); DecimalFormat decimalFormat = new DecimalFormat("0.00"); double v = GetMaxMoney(number, prices, D, N); System.out.print(decimalFormat.format(v)); } public static double GetMaxMoney(String[] number, String[] prices, double D, double N){ ArrayList<double[]> doubles = new ArrayList<>(); for (int i = 0; i < N; i++){ double[] temp = new double[3]; double price = Double.parseDouble(prices[i]); double num = Double.parseDouble(number[i]); temp[0] = price/num; //單價 temp[1] = price; //價格 temp[2] = num; doubles.add(temp); } Collections.sort(doubles, new Comparator<double[]>() { @Override public int compare(double[] o1, double[] o2) { if (o2[0] >= o1[0]){ return 1; }else { return -1; } } }); double sum = 0.0; for (double[] moonPie : doubles){ if (D == 0) break; if (moonPie[2] <= D){ sum += moonPie[1]; D -= moonPie[2]; }else { sum += D*moonPie[0]; D = 0; } } return sum; } }