B1020 月餅(25 分)
阿新 • • 發佈:2018-08-28
所有 最大 銷售 正整數 ace 庫存量 數字 種類 結構體
B1020 月餅(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
思考
首先建立一個結構體數組。結構體內是庫存量噸數和每萬噸售價,處理一下。
優先賣光每萬噸售價最高的月餅,排序。
AC代碼
#include <cstdio> #include <algorithm> #define maxn 1010 using namespace std; struct mooncake{ double save; double sale; double average; }; bool cmp(mooncake a,mooncake b){ return a.average > b.average; } int main(){ int n;//月餅種數 double d;//市場需求月餅 struct mooncake moon[maxn]; scanf("%d %lf", &n, &d); for(int i=0 ;i < n; i++) scanf("%lf", &moon[i].save); for(int i=0 ;i < n; i++) scanf("%lf", &moon[i].sale); for(int i=0 ;i < n; i++) moon[i].average = moon[i].sale / moon[i].save; sort(moon, moon + n, cmp);//按均價從大到小排列 int i =0; double sale = 0, temp = 0; //temp記錄已賣出的萬噸數 while(i<n && temp < d){/*枚舉的時候這個退出循環的條件容易被略過,第3測試點就是這個問題*/ temp += moon[i].save; sale += moon[i].sale; i++; } if(temp > d){ sale = sale - moon[i-1].sale + (d - (temp-moon[i-1].save))*moon[i-1].average; } printf("%.2lf", sale); return 0; }
跳過究竟是什麽問題???就是全部n種月餅用上都不夠或剛剛好的情況
B1020 月餅(25 分)