質問
1070 月餅 (25 分)
月餅は伝統的に中秋節に食べられる中国のベーカリー製品です。伝統的な月餅には、その地域の文化に応じてさまざまな種類の餡や皮が使われています。あらゆる種類の月餅の在庫量と価格、市場の最大総需要を考慮すると、得られる最大利益を知ることができます。
注: 部分的な在庫保管が可能です。このサンプルは、在庫量が 18 万トン、15 万トン、10 万トンの 3 種類の月餅があり、価格が 75 億元、72 億元、45 億元である場合の状況を示しています。市場の需要がせいぜい20万トンであれば、二種月餅は15万トン、三種月餅は5万トンが精々売れます。したがって、利益の合計は 7.2 + 4.5/2 = 9.45 (10 億元) となります。
入力仕様:
各入力ファイルには 1 つのテスト ケースが含まれます。各ケースの最初の行には、2 つの正の整数 N (≤1000)、さまざまな種類の月餅の数、D (≤500,000 トン)、市場の最大総需要が含まれます。次に、2 行目はプラスの在庫量 (千トン) を示し、3 行目は N 種類の月餅のプラスの価格 (10 億元) を示します。行内のすべての数値はスペースで区切られます。
出力仕様:
各テスト ケースについて、最大利益 (10 億元単位) を 1 行に、小数点以下 2 桁までの精度で出力します。
入力例:
3 200
180 150 100
7.5 7.2 4.5
末尾に空白行なし
出力例:
9.45
一連の考え
欲張りに、さまざまな月餅を単価の高いものから安いものまで並べてみましょう。毎回販売する単価が高いものを選択することで、最大の利益を得ることができます。
コード
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct mooncake{
float total;
float price;
};
vector<mooncake> all;
bool cmp(mooncake a,mooncake b){
return a.price>b.price;
}
int main(){
int n;
float m,temp;
float f,ans=0;
cin>>n>>m;
for (int i = 0; i < n; ++i) {
cin>>temp;
mooncake cake;
cake.total = temp;
all.push_back(cake);
}
for (int j = 0; j < n; ++j) {
cin>>f;
all[j].price = f/all[j].total;
}
sort(all.begin(),all.end(),cmp);
for (int k = 0; k < all.size(); ++k) {
if(m==0){
printf("%.2f",ans);
return 0;
}
if(m<=all[k].total){
//需求小于当前月饼数量
ans = ans + all[k].price*m;
m = 0;
}
else if(m>all[k].total){
ans = ans + all[k].price*all[k].total;
m = m - all[k].total;
}
}
printf("%.2f",ans);
return 0;
}
要約する
注意事項:
1. 各種月餅の需要と在庫はフロートとして定義されなければなりません。そうでない場合は、通過できないサンプルが発生します。
2. 境界状況を考慮すると、需要はすべての月餅在庫の合計よりも大きくなります。