题目
Mooncake is a Chinese bakery product traditionally eaten during the Mid-Autumn Festival. Many types of fillings and crusts can be found in traditional mooncakes according to the region's culture. Now given the inventory amounts and the prices of all kinds of the mooncakes, together with the maximum total demand of the market, you are supposed to tell the maximum profit that can be made.
Note: partial inventory storage can be taken. The sample shows the following situation: given three kinds of mooncakes with inventory amounts being 180, 150, and 100 thousand tons, and the prices being 7.5, 7.2, and 4.5 billion yuans. If the market demand can be at most 200 thousand tons, the best we can do is to sell 150 thousand tons of the second kind of mooncake, and 50 thousand tons of the third kind. Hence the total profit is 7.2 + 4.5/2 = 9.45 (billion yuans).
输入
Each input file contains one test case. For each case, the first line contains 2 positive integers N (≤1000), the number of different kinds of mooncakes, and D (≤500 thousand tons), the maximum total demand of the market. Then the second line gives the positive inventory amounts (in thousand tons), and the third line gives the positive prices (in billion yuans) of N kinds of mooncakes. All the numbers in a line are separated by a space.
输出
For each test case, print the maximum profit (in billion yuans) in one line, accurate up to 2 decimal places.
样例输入
3 200
180 150 100
7.5 7.2 4.5
样例输出
9.45
题意理解
给你一些月饼 然后每种月饼有 数量 总价值
然后问你市场需要的总数量的情况下 能够带走的最大价值是多少
然后这个月饼是可以拆分的 所以我们可以贪心的想
按照数量和总价值 去算出每种月饼的平均单价
然后按照单价去排序 从高价值到低价值
我们尽量挑选单价高的月饼带走
那么如果总价值允许 我们就将当前价值的总数全部带走
如果不够带走那些数量的话 我们就将能带走的剩余数量乘上单价 就是我们剩余能带走的月饼价值 也即是可以拆分的
最后的总价值 就是能带走的数量限制下来的最大价值
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
double sum;
typedef struct mooncake{
double num,sum,price;
}mooncake;
mooncake a[N];
bool cmp(mooncake x,mooncake y){
return x.price>y.price;
}
int main(){
cin>>n>>sum;
for(int i=0;i<n;i++){
cin>>a[i].num;
}
for(int i=0;i<n;i++){
cin>>a[i].sum;
a[i].price=a[i].sum/a[i].num;
}
sort(a,a+n,cmp);
double res=0;
for(int i=0;i<n;i++){
if(sum>=a[i].num){
res+=a[i].sum;
sum-=a[i].num;
}
else {
res+=sum*a[i].price;
sum=0;
break;
}
}
printf("%.2lf\n",res);
return 0;
}