[PAT解题报告] 月饼 (25)
转载from http://tech-wonderland.net/blog/pat-1070-mooncake.html
这个是贪心算法. 求得每种月饼的单位数量上的售价, 按照这个单位售价降序排列, 依次尽量取得单位售价比较高的去填充那个市场需求, 知道达到那个最大的市场需求. 所得到的利润就是最大的. 换个角度就说市场的最大需求量固定, 那么我们当然希望这些个需求量里面单位数量的销售价格越高越好, 所以我们降序排列就可以得到最大利润. AC代码如下:
#include <cstdio>
#include <algorithm>
#include <vector>
struct Node {
double amount;
double price;
};
bool cmp(const Node &n1, const Node &n2) {
return n1.price * n2.amount > n2.price * n1.amount;
}
double gao(int n, double d, std::vector<Node> &cakes) {
std::sort(cakes.begin(), cakes.end(), cmp);
double profit = 0.0;
for(int i = 0; d > 0 && i < n; ++i) {
int sell = std::min(d, cakes[i].amount);
profit += cakes[i].price * (sell * 1.0 / cakes[i].amount);
d -= sell;
}
return profit;
}
int main() {
int N, D;
scanf("%d %d", &N, &D);
std::vector<Node> cakes(N);
for(int i = 0; i < N; ++i)
scanf("%lf", &cakes[i].amount);
for(int i = 0; i < N; ++i)
scanf("%lf", &cakes[i].price);
printf( "%.2lf\n", gao(N, D, cakes) );
return 0;
}

