L2-003月餅(25点)[PTA] [貪欲]

月餅は中国人が中秋節で食べる伝統的な食べ物で、地域によって味の違う月餅がたくさんあります。すべての種類の月餅の在庫、総販売価格、および市場での最大需要を考慮して、取得できる最大利益を計算してください。

注:販売時に在庫の一部を取り出すことができます。例の状況は次のとおりです。月餅が3種類ある場合、在庫はそれぞれ18、15、10万トン、総販売価格はそれぞれ75、72、45億元です。市場の最大需要が20万トンしかない場合、最大の利益戦略は、2番目の月餅15万トンと3番目の月餅50,000トンをすべて販売し、72 + 45/2 = 9.45(10億元)を取得することです。 )。

入力フォーマット:

各入力にはテストケースが含まれています。各テストケースは、最初に月餅の種類の数を表す1000 N以下の正の整数と、市場での最大需要を表す500(10,000トン)以下の正の整数を示します。次の行は、各タイプの月餅の在庫を示すN個の正の数(10,000トン)を示し、最後の行は、各タイプの月餅の合計販売価格(1億元)を示すN個の正の数を示します。数字はスペースで区切られます。

出力フォーマット:

テストケースの各セットについて、最大利益を1行で、1億元で、小数点以下2桁まで正確に出力します。

入力サンプル:

3 20
18 15 10
75 72 45

サンプル出力:

94.50

 doubleを使用する必要があります。そうしないと、1つの例が合格しません

ACコード:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<queue>
#include<stack>
using namespace std;
const int maxv = 100100;
struct mooncake
{
    double price,num;
    double p_n;
}m[1100];
bool cmp(mooncake a,mooncake b)
{
    return a.p_n>b.p_n;
}
int main()
{
    int N,D;
    cin>>N>>D;
    for(int i=0;i<N;i++)
    {
        cin>>m[i].num;
    }
    for(int i=0;i<N;i++)
    {
        cin>>m[i].price;
        m[i].p_n=m[i].price/m[i].num;
    }
    sort(m,m+N,cmp);
    double ans=0;
    for(int i=0;i<N;i++)
    {
        if(m[i].num<D)
        {
            ans+=m[i].price;
            D-=m[i].num;
        }
        else
        {
            ans+=m[i].p_n*D;
            break;
        }
    }
    printf("%.2f",ans);
    return 0;
}


 

おすすめ

転載: blog.csdn.net/qq_43660826/article/details/110110871