PAT-乙级-1020.月饼(25)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有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 第一种算法 动态分配内存(c)
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main() 5 { 6 int N,M; 7 scanf("%d %d",&N,&M); 8 //calloc在动态分配完内存后,自动初始化该内存空间为零, 9 //malloc不初始化,里边数据是随机的垃圾数据。 10 11 //函数原型:void *calloc(size_t n, size_t size); 12 //功 能: 在内存的动态存储区中分配n个长度为size的连续空间, 函数 13 //返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。 14 15 double *a=(double *)calloc(N,sizeof(double));//库存 16 double *b=(double *)calloc(N,sizeof(double));//总价 17 double *c=(double *)calloc(N,sizeof(double));//单价 18 19 for(int i=0;i<N;i++) 20 scanf("%lf",&a[i]); 21 22 for(int i=0;i<N;i++) 23 { 24 scanf("%lf",&b[i]); 25 c[i]=b[i]/a[i]; 26 } 27 28 for (int i=0;i<N;i++) 29 { 30 for (int j=i; j<N;j++) 31 { 32 if (c[i]<c[j]) 33 { 34 double temp=c[i]; 35 c[i]=c[j]; 36 c[j]=temp; 37 38 temp=a[i]; 39 a[i]=a[j]; 40 a[j]=temp; 41 42 temp=b[i]; 43 b[i]=b[j]; 44 b[j]=temp; 45 } 46 } 47 } 48 49 double demand=0; 50 double sum_price=0; 51 int i; 52 53 for(i=0;i<N;i++) 54 { 55 demand += a[i]; 56 if(demand >= M) 57 { 58 sum_price += ((a[i]-demand+M) *c[i]); 59 printf("%.2lf\n",sum_price); 60 break; 61 } 62 else 63 { 64 sum_price += b[i]; 65 } 66 } 67 68 if(i>=N) printf("%.2lf\n",sum_price); 69 70 return 0; 71 }
2 第二种算法 用结构体(c++) 考虑到c++的sort函数比较方便使用
1 #include <stdio.h> 2 #include <algorithm> 3 #include <stdbool.h> 4 5 using namespace std; 6 7 struct mooncake 8 { 9 double store; //库存量 10 double sell; //总价 11 double price; //单价 12 }a[1010]; 13 14 bool cmp(mooncake a, mooncake b) 15 { 16 return a.price > b.price; 17 } 18 19 int main() 20 { 21 int n; 22 double demand; 23 scanf("%d%lf",&n,&demand); 24 for(int i =0; i < n; i++) 25 { 26 scanf("%lf",&a[i].store); 27 } 28 for(int i = 0; i < n; i++) 29 { 30 scanf("%lf",&a[i].sell); 31 a[i].price = a[i].sell / a[i].store; 32 } 33 34 sort(a, a+n, cmp); //按照cmp的要求进行排序 35 double ans = 0; 36 for(int i=0; i < n; i++) 37 { 38 if(a[i].store < demand) 39 { 40 demand -= a[i].store; 41 ans += a[i].sell; 42 } 43 else 44 { 45 ans += demand * a[i].price; 46 break; 47 } 48 } 49 printf("%.2f\n",ans); 50 return 0; 51 52 }