PTA basic 1020 月饼 (25 分) c语言实现(gcc)
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 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
解题思路
1.注意输入输出 (1) 正整数 N 表示月饼的种类 (2) 正整数 D 表示市场最大需求量 (3) 一行给出 N 个正数表示每种月饼的库存量 (4) 一行给出 N 个正数表示每种月饼的总售价
N和D为正整数,但是N个正数表示各种月饼库存量(使用remain作为变量名)不一定是整数(监测点2),同样的,每种月饼售价(pricePer)也不一定是整数,所以要用fload浮点数存储库存量和售价
2.追求售价最大化,要先把单价高的月饼销售出去, 所以需要对每种月饼按照单价的高低排序,当需求量>0时,先售出单价高的月饼,当前选中的月饼种类的库存为0时,销售下一个单价较低的月饼,要注意更新库存和需求量
1 #include "stdio.h" 2 #include "stdlib.h" 3 typedef struct yuebingStruct{ 4 float remain;//剩余 检测点2 5 float pricePer;//单价 检测点3 6 } yuebing; 7 8 int compare(const void *a,const void *b){//int compare(const void *left,const void *right) 9 int result=0; 10 yuebing *pa=(yuebing *)a;//需要对左右元素进行指定类型转换 (手动) 11 yuebing *pb=(yuebing *)b; 12 if(pa->pricePer>pb->pricePer){//如果左边的元素单价更高,则排在前面,compare返回值为负数的结果时,左边元素在前 13 result=-1; 14 }else{ 15 result=1; 16 } 17 return result; 18 } 19 int main(){ 20 int n,d,i=0,j,last;//N D 计数变量i j 队尾标记 21 float totalSale=0,tempsum,totalPrice;//总售价 每种月饼售出的总价 用于接收每种月饼总售价 22 scanf("%d %d",&n,&d); 23 yuebing yb[n]; 24 for(j=0;j<n;j++){ 25 scanf("%f",&yb[j].remain); 26 } 27 28 for(j=0;j<n;j++){ 29 scanf("%f",&totalPrice); 30 yb[j].pricePer=totalPrice/yb[j].remain; 31 } 32 last=j-1; 33 qsort(yb,n,sizeof(yuebing),compare);//参数1234为:数组本身,元素个数,元素的大小,比较函数 34 while(d&&yb[last].remain){//当需求量或库存量一方不为0的时候,进行交易 35 if(d>=yb[i].remain){//需求量>=月饼存量时,月饼售出,售出价格计入总售出,对应种类月饼库存清零 36 tempsum=yb[i].remain*yb[i].pricePer; 37 d=d-yb[i].remain; 38 yb[i].remain=0; 39 }else{//需求量<月饼存量时,售出价格计入总售出,库存减少,需求清零 40 tempsum=d*yb[i].pricePer; 41 yb[i].remain=yb[i].remain-d; 42 d=0; 43 } 44 totalSale=totalSale+tempsum; 45 i++; 46 } 47 printf("%.2f\n",totalSale);//输出格式.2两位尾数 48 return 0; 49 }