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 }