月饼 (25 分)
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3
种月饼,其库存量分别为 18
、15
、10
万吨,总售价分别为 75
、72
、45
亿元。如果市场的最大需求量只有 20
万吨,那么我们最大收益策略应该是卖出全部 15
万吨第 2
种月饼、以及 5
万吨第 3
种月饼,获得 72 + 45/2 = 94.5
(亿元)。
输入格式:
每个输入包含一个测试用例。每个测试用例先给出一个不超过 1000
的正整数 N
表示月饼的种类数、以及不超过 500
(以万吨为单位)的正整数 D
表示市场最大需求量。随后一行给出 N
个正数表示每种月饼的库存量(以万吨为单位);最后一行给出 N
个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后 2
位。
输入样例:
3 20
18 15 10
75 72 45
输出样例:
94.50
代码:
#include<stdio.h>
typedef struct Stu
{
float k; //库存
float s; //总售价
float d; //单价
};
int main()
{
int i,j,n,m;
float sum0=0,sum1=0;
scanf("%d %d",&n,&m);
struct Stu stu[n],stu1[n];
for(i=0;i<n;i++)
{
scanf("%f",&stu[i].k);
}
for(i=0;i<n;i++)
{
scanf("%f",&stu[i].s);
stu[i].d=stu[i].s/stu[i].k; //计算每种月饼的单价
}
for(i=0;i<n-1;i++) //将单价从高到低依次排序
{
for(j=i+1;j<n;j++)
{
if(stu[i].d<stu[j].d)
{
stu1[1]=stu[i];
stu[i]=stu[j];
stu[j]=stu1[1];
}
}
}
for(i=0;i<n;i++)
{
sum0+=stu[i].k; //假设现在还没有超过市场最大需求量
sum1+=stu[i].s;
if(sum0>m) //超过了 减去 用差额来算金额
{
sum0-=stu[i].k;
sum1-=stu[i].s;
sum1=sum1+((float)m-sum0)*stu[i].d; //(float)m-sum0是差额 ((float)m-sum0)*stu[i].d是差额所赚的钱
break;
}
else if(sum0==m)
{
break;
}
}
printf("%.2f\n",sum1);
return 0;
}
提交结果: