1. 程式人生 > >B1020 月餅(25 分)

B1020 月餅(25 分)

所有 最大 銷售 正整數 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 分)