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) 正整数 表示月饼的种类 (2) 正整数 表示市场最大需求量 (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 }

 

posted @ 2021-04-21 15:25  keiiha  阅读(270)  评论(0编辑  收藏  举报