PAT乙級1020

1020 月餅 (25分)

題目地址: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

  1. 獲取單價最高的月餅時,能夠按照下面代碼中的依次找出最大值,也能夠對月餅單價進行排序,但此時相應的庫存,和總售價也要進行相應的變化,能夠將其封裝爲一個結構體。

代碼段

#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;
}

更改過程

  1. 忽略市場需求大於月餅總庫存的狀況,就是if (index == -1)的那個地方的判斷,致使數組越界,但是C++好像你數組越界以後,有時也是會返回值的,不報異常,更可怕。
  2. 在使用findMaxUnitPrice函數找到單價最高的月餅以後,由於下次再找時,須要單價第二高的月餅,因此將其值置爲0,下次仍然可使用該函數。可是後面的總大收益maxProfit進行計算的時候,起初仍然直接用unitPrice[index] * D, 此時單價已經置爲0了,致使最大收益偏低。
相關文章
相關標籤/搜索