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