个人博客:打开链接
- 月饼 (25)
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static class Mooncake implements Comparable<Mooncake> {
public int mount;
public double price;
public double unit;
public Mooncake() {
}
public Mooncake(Integer mount, Double price) {
this.mount = mount;
this.price = price;
this.unit = price / mount;
}
public int compareTo(Mooncake m) {
if (this.unit < m.unit)
return 1;
else if (this.unit >= m.unit)
return -1;
else
return 0;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
String[] data = input.split(" ");
int n = Integer.parseInt(data[0]);
int need = Integer.parseInt(data[1]);
if (n <= 0 || n > 1000 || need <= 0 || need > 500)
return;
String[] w = br.readLine().split(" "), p = br.readLine().split(" ");
br.close();
List<Mooncake> mooncakes = new ArrayList();
for (int i = 0; i < n; i++) {
Mooncake m = new Mooncake(Integer.parseInt(w[i]),Double.parseDouble(p[i]));
mooncakes.add(m);
}
Collections.sort(mooncakes);
double total = 0.0;
int cur = 0;
for (int i = 0; i < mooncakes.size(); i++) {
if (cur + mooncakes.get(i).mount < need) {
cur = cur + mooncakes.get(i).mount;
total = total + mooncakes.get(i).price;
} else if (cur < need) {
total = total + mooncakes.get(i).unit * (need - cur);
cur = need;
}
}
System.out.println(String.format("%.2f", total));
}
}