1020 月饼 (25)(25 分) java

1020 月饼 (25)(25 分) java

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有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.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
 
public class Main {
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tokenizer = new StringTokenizer("");

    static class Cake {
        double a;
        double b;
        double c;
    }
    public static void main(String[] args) throws IOException {
        int n;
        double m;
        n = nextInt();
        m = nextDoule();
         Cake[] arr = new Cake[n];
        for (int i = 0; i < n; i ++) {
            arr[i] = new Cake();
            arr[i].a = nextDoule();
            //将 arr[i].a = nextDoule(); 改为 arr[i].a = nextInt(); 就过不了
            // 不知道是题目出错了 还是案例有问题
            //注nextDoule()  输入doule类型 
        }
        for (int i = 0; i < n; i ++) {
            arr[i].b = nextDoule();
            if (arr[i].a != 0) {
                arr[i].c = arr[i].b / arr[i].a;
            } else {
                arr[i].c = 0;
            }


        }
        Comparator cmp = new MyComparator();
        Arrays.sort(arr, cmp);
        double sum = 0;
        for (int i = 0; i < n; i ++) {

             
            if (arr[i].a <= m) {
                 m = m - arr[i].a;
                 sum += arr[i].b;

             } else {
                sum += (m  * arr[i].c);
                break;
            }
        }
        System.out.printf("%.2f" , sum);

    }
    static class MyComparator implements Comparator<Cake> {

        @Override
        public int compare(Cake o1, Cake o2) {
            if (o1.c > o2.c) {
                return -1;
            } else if(o1.c < o2.c){
                return 1;
            } else {
                return 0;
            }

        }
    }
    static String next() throws IOException {
        while (!tokenizer.hasMoreTokens()) {
            tokenizer = new StringTokenizer(reader.readLine());
        }
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    static double nextDoule() throws IOException {
        return Double.parseDouble(next());
    }

    static long nextLong() throws IOException {
        return Long.parseLong(next());
    }
}

总结
利用贪心思想 将性价比最高的月饼先售出 采用Arrays.sort()方法排序

坑:
所有参数最好都用double类型(代码中有注解)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海边的宇航员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值