1020 月饼 (25分)

  1. 这里采用“总是选择单价最高的月饼出售,可以获得最大的利润”的策略。因此,对每种月饼,都根据其库存量和总售价来计算出该种月饼的单价。之后,将所有月饼按单价从高到低排序。
  2. 从单价高的月饼开始枚举。
    1. 如果该种月饼的库存量不足以填补所有需求量,则将该种月饼全部卖出,此时需求量减少该种月饼的库存量大小,收益值增加该种月饼的总售价大小。
    2. 如果该种月饼的库存量足够供应需求量,则只提供需求量大小的月饼,此时收益值增加当前需求量乘以该种月饼的单价,而需求量减为0。这样,最后得到的收益值即为所求的最大收益值。

策略正确性的证明:假设有两种单价不同的月饼,其单价分别为a和b (a<b)。如果当前需求量为K,那么两种月饼的总收入分别为aK与bK,而aK < bK显然成立,因此需要出售单价更高的月饼。

ps:月饼库存量和总售价可以是浮点数(题目中只说是正数,没说是正整数),需要用double型存储。对于,总需求量D虽然题目说是正整数,但是为了后面计算方便,也需要定义为浮点型。

const int N=1010;
PDD a[N];
int n;
double m;

bool cmp(PDD &a,PDD &b)
{
    return a.se/a.fi > b.se/b.fi;
}

int main()
{
    cin>>n>>m;

    for(int i=0;i<n;i++) cin>>a[i].fi;
    for(int i=0;i<n;i++) cin>>a[i].se;

    sort(a,a+n,cmp);

    double res=0;
    for(int i=0;i<n;i++)
    {

        if(m >= a[i].fi) res+=a[i].se, m-=a[i].fi;
        else 
        {
            res+=a[i].se/a[i].fi*m, m=0;
            break;
        }
    }

    printf("%.2f
",res);
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14337717.html