1020. 月饼 (25)--浙大PAT乙级真题java实现

个人博客:打开链接

  1. 月饼 (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 {
        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 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));
    }
}


你可能感兴趣的:(PAT乙级)