注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。
输入样例:
3 20 18 15 10 75 72 45
输出样例:
94.50
1 #include<stdio.h> 2 #include<stdlib.h> 3 struct goods 4 { 5 double save; //库存 6 double ssale; //总售价 7 double dsale; //单价 8 }; 9 double sum; 10 int cmp( const void *a, const void *b) 11 { 12 struct goods * c = ( struct goods *)a; 13 struct goods * d = ( struct goods *)b; 14 return c->dsale < d->dsale ? 1:-1; 15 } 16 int main() 17 { 18 int n,d; 19 int i; 20 scanf("%d%d",&n,&d); 21 struct goods g[n]; 22 for( i=0; i<n; i++) 23 scanf("%lf",&g[i].save); 24 for( i=0; i<n; i++) 25 { 26 scanf("%lf",&g[i].ssale); 27 g[i].dsale = g[i].ssale / g[i].save; //求得单价 28 } 29 qsort( g,n,sizeof(g[1]),cmp); //对单价降序排序 30 31 for( i=0; i<n; i++) 32 { 33 if( g[i].save<=d) //如果库存量小于等于需求量 34 { 35 d -= g[i].save; 36 sum += g[i].ssale; 37 } 38 else //库存量大于需求量的时候则执行完毕,可直接退出 39 { 40 sum += d * g[i].dsale; 41 break; 42 } 43 44 } 45 printf("%.2f ",sum); 46 return 0; 47 }