1020. 月饼

题目截图:

 

思路:

  贪心算法。按照单价从高往低遍历即可。详解请看另一篇博客

 

代码:

 1 /*
 2     1020. 月饼
 3 */
 4 
 5 #include <stdio.h>
 6 #include <string.h>
 7 #include <math.h>
 8 #include <stdlib.h>
 9 #include <time.h>
10 
11 typedef struct {    // 月饼 
12     double store;    // 库存 
13     double sell;    // 总售价 
14     double price;    // 单价 
15 } mooncake;
16 mooncake cake[1010];
17 int cmp(const void* a, const void* b) {    // 按单价从大到小排列 
18     mooncake* c = (mooncake*)a;
19     mooncake* d = (mooncake*)b;
20     return d->price > c->price ? 1 : -1;
21 }
22 
23 int main() {
24     int n, d, i;    // n 月饼总类数,d 市场最大需求量
25     double sum = 0.0f;    // sum 最大收益 
26     scanf("%d %d", &n, &d);
27     for(i=0; i<n; ++i) {    // 输入库存量 
28         scanf("%lf", &cake[i].store);
29     } 
30     for(i=0; i<n; ++i) {    // 输入总售价 
31         scanf("%lf", &cake[i].sell);
32     } 
33     for(i=0; i<n; ++i) {    // 计算单价 
34         cake[i].price = cake[i].sell/cake[i].store;
35     } 
36     qsort(cake, n, sizeof(mooncake), cmp);    // 按照单价排序
37     for(i=0; i<n; ++i) {
38         if(cake[i].store <= d) {    // 需求量高于库存 
39             sum += cake[i].sell; 
40             d -= cake[i].store;        // 全部卖出 
41         } else if(cake[i].store > d) {    // 需求量低于库存 
42             sum += cake[i].sell/(cake[i].store/d);    // 部分卖出 
43             break;
44         }
45     } 
46     printf("%.2f\n", sum);        // 输出2位小数 
47     
48     return 0;
49 }

 

posted @ 2018-02-27 11:38  Just_for_Myself  阅读(244)  评论(0编辑  收藏  举报