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 }

 

posted @ 2018-04-25 20:51  leezheng  阅读(224)  评论(0编辑  收藏  举报