題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805301562163200ios
月餅是中國人在中秋佳節時吃的一種傳統食品,不一樣地區有許多不一樣風味的月餅。現給定全部種類月餅的庫存量、總售價、以及市場的最大需求量,請你計算能夠得到的最大收益是多少。數組
注意:銷售時容許取出一部分庫存。樣例給出的情形是這樣的:假如咱們有 3 種月餅,其庫存量分別爲 1八、1五、10 萬噸,總售價分別爲 7五、7二、45 億元。若是市場的最大需求量只有 20 萬噸,那麼咱們最大收益策略應該是賣出所有 15 萬噸第 2 種月餅、以及 5 萬噸第 3 種月餅,得到 72 + 45/2 = 94.5(億元)。函數
每一個輸入包含一個測試用例。每一個測試用例先給出一個不超過 1000 的正整數 N 表示月餅的種類數、以及不超過 500(以萬噸爲單位)的正整數 D 表示市場最大需求量。隨後一行給出 N 個正數表示每種月餅的庫存量(以萬噸爲單位);最後一行給出 N 個正數表示每種月餅的總售價(以億元爲單位)。數字間以空格分隔。測試
對每組測試用例,在一行中輸出最大收益,以億元爲單位並精確到小數點後 2 位。spa
3 20 18 15 10 75 72 45
94.50
輸入月餅種類數量,不一樣種類總售價,不一樣種類庫存,計算各自單價,按照市場需求量和庫存數量的關係分狀況進行計算。依次按照單價最高的優先。code
#include <iostream> using namespace std; // 找到單價最高的月餅,返回其下標位置 short findMaxUnitPrice(float unitPrice[], int n); int main() { // 月餅數量 short N = 0; // 市場總需求量 short D = 0; cin >> N >> D; // 庫存 float stock[N]; // 總售價 float totalPrice[N]; // 單價 float unitPrice[N]; // 總收益 float maxProfit = 0.0; for (int i = 0; i < N; i++) { cin >> stock[i]; } for (int i = 0; i < N; i++) { cin >> totalPrice[i]; unitPrice[i] = totalPrice[i] / stock[i]; } // 找到單價最高的月餅 short index = findMaxUnitPrice(unitPrice, N); // 市場需求大於單個種類的月餅庫存 if (D > stock[index]) { while (D > stock[index]) { maxProfit += totalPrice[index]; D -= stock[index]; index = findMaxUnitPrice(unitPrice, N); // 若是月餅所有已經「出售」 if (index == -1) { break; } } // 單種月餅的庫存量大於市場需求 if (index != -1) { maxProfit += ((totalPrice[index] / stock[index]) * D); } } else { // 單種月餅的庫存量大於市場需求 maxProfit += ((totalPrice[index] / stock[index]) * D); } printf("%0.2f\n", maxProfit); return 0; } short findMaxUnitPrice(float unitPrice[], int n) { float max = 0; short index = -1; for (int i = 0; i < n; i++) { if (max < unitPrice[i]) { max = unitPrice[i]; index = i; } } // 若是月餅將要參與計算,則將其置爲0 unitPrice[index] = 0; return index; }