1. 程式人生 > >PAT Basic 1020. 月餅 (25)(C語言實現)

PAT Basic 1020. 月餅 (25)(C語言實現)

, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo

題目

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

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

輸入格式

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

輸出格式

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

輸入樣例
3 20
18 15 10
75 72 45
輸出樣例
94.50

思路

每次找到未賣完的月餅中單價最高的,分情況討論一下這種月餅的庫存是否足夠剩下的需求量。

更新:這道題迷迷糊糊就AC了,看了別人的文章才知道庫存可能不夠。。。(′`〃)。我通過的原因是每次賣出一種月餅,就將該月餅的售價改為0,這樣時候找最高單價的時候就不會找到這種月餅了,這是初衷。不過由於售價改為0,如果庫存不夠(此時所有售價都為0),月餅還是在“賣”,但是沒有收入(。・∀・)ノ゙,因此相當於變相地解決了庫存不夠的問題。(突然覺得自己好機智怎麼辦)

程式碼

#include <stdio.h>
int main()
{
    int N, max;
    float D, Storage[1000], Total = 0, Price[1000];    
    scanf("%d %f", &N, &D);
    for(int i = 0; i < N; i++) scanf("%f", Storage + i);
    for(int i = 0; i < N; i++) scanf("%f", Price + i);

    while(D > 0)
    {
        max = 0;
        for(int i = 0; i < N; i++)
            if(Price[i] / Storage[i] > Price[max] / Storage[max])
                max = i;

        if(Storage[max] < D) 
        {
            Total += Price[max];
            D -= Storage[max];
            Price[max] = 0;
        } 
        else 
        {
            Total += Price[max] * D / Storage[max];
            D = 0;
        }
    }
    printf("%.2f", Total);

    return 0;
}