PAT(上級レベル)実践1070月餅(25ポイント)[貪欲]

月餅は、伝統的に中秋節の間に食べられる中国のベーカリー製品です。詰め物とクラストの多くの種類は、地域の文化によると、伝統的な月餅で見つけることができます。今、一緒に市場の最大の総需要で、在庫量と月餅のすべての種類の価格を与え、あなたを行うことができる最大の利益を伝えることになっています。

注:一部の在庫保管を撮影することができます。サンプルを示し、以下の状況:在庫量は180、150、および10万トンを、さと価格は7.5、7.2、および45億yuansであると月餅の3種類を与えられました。市場の需要が最も20万トンであることができれば、私たちができる最善のは、月餅の第二種の15万トン、及び第三種の5万トンを販売することです。したがって、総利益は、7.2 + 4.5 / 2 = 9.45(億yuans)です。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、2つの正の整数が含まれてい N 1000年 ) N(≤1000) 、月餅の異なる種類の数、および D D 500 ≤500 千トン)、市場の最大総需要。そして、2行目は(千トンで)陽性の在庫量を与え、3行目は(億yuansで)正価格を与えます N N 月餅の種類。行のすべての数字は、スペースで区切られます。

出力仕様:

各テストケースのために、1つのラインの最大の利益(億でyuans)、小数点以下2桁の精度までを印刷します。

サンプル入力:

3 200
180 150 100
7.5 7.2 4.5

サンプル出力:

9.45

問題の意味

月餅のN種類がありますが、最大の市場の需要は、Dがあり、ほとんどの販売を求めて、各月餅の合計数と合計金額を与えます。

思考

最も高価な価格スタートを販売します。

コード

#include <algorithm>
#include <iomanip>
#include <iostream>

using namespace std;

struct mk {
    double amount, price;
} mks[1005];

int main() {
    int n;
    double d, r = 0;
    cin >> n >> d;

    for (int i = 0; i < n; ++i)
        cin >> mks[i].amount;
    for (int i = 0; i < n; ++i)
        cin >> mks[i].price;

    sort(mks, mks + n, [](mk a, mk b) {
        return a.price * b.amount > b.price * a.amount;
    });

    for (int i = 0; i < n; ++i) {
        if (d == 0)
            break;
        if (mks[i].amount < d) {
            d -= mks[i].amount;
            r += mks[i].price;
        } else {
            r += mks[i].price * d / mks[i].amount;
            break;
        }
    }

    cout << setiosflags(ios::fixed) << setprecision(2) << r;
}
公開された184元の記事 ウォン称賛19 ビュー20000 +

おすすめ

転載: blog.csdn.net/Exupery_/article/details/104213856
おすすめ