杭电oj--FatMouse‘交易1009

文章讲述了如何利用贪心算法解决一个问题,即在给定猫粮预算下,FatMouse在多个房间交易JavaBeans以获取最大数量。通过计算每个房间的单位价值并按顺序选择最优交易,输出每个测试用例中可能获得的最大JavaBeans数量。
摘要由CSDN通过智能技术生成
问题描述
胖老鼠准备了M磅的猫粮,准备与守卫仓库的猫交易,里面装着他最喜欢的食物JavaBean。
仓库有N个房间。第 i 个房间包含 J[i] 磅的 JavaBeans,需要 F[i] 磅的猫粮。FatMouse 不必交易房间里的所有 JavaBeans,相反,如果他支付 F[i]* a% 磅的猫粮,他可能会得到 J[i]* a% 磅的 JavaBeans。这里的 a 是一个实数。现在他给你布置了这个作业:告诉他他可以获得的最大 JavaBeans 数量。
 

输入
输入由多个测试用例组成。每个测试用例都以包含两个非负整数 M 和 N 的行开头。然后是 N 行,每行分别包含两个非负整数 J[i] 和 F[i]。最后一个测试用例后面跟着两个 -1。所有整数都不大于 1000。
 

输出
对于每个测试用例,在一行中打印一个精确到小数点后 3 位的实数,这是 FatMouse 可以获得的最大 JavaBeans 数量。
 

样本输入
5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1
 

示例输出
13.333
31.500

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int m = sc.nextInt();//钱
            int n = sc.nextInt();//房间数
            if (m == -1 && n == -1) break;
            double[][] arr = new double[n][3];
            for (int i = 0; i < arr.length; i++) {
                arr[i][0] = sc.nextDouble();//可获得的食物量
                arr[i][1] = sc.nextDouble();//价格
                arr[i][2] = arr[i][1] / arr[i][0];//单位价格
            }
            Arrays.sort(arr, new Comparator<double[]>() {
                @Override
                public int compare(double[] o1, double[] o2) {
                    return Double.compare(o1[2], o2[2]);
                }
            });
            double sum = 0;
            for (int i = 0; i < n; i++) {
                if (m <= 0) break;
                if (m >= arr[i][1]) {
                    sum += arr[i][0];
                    m -= arr[i][1];
                } else {
                    sum += m / arr[i][2];
                    break;
                }
            }
            System.out.printf("%.3f", sum);
            System.out.println();
        }

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

.无聊人.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值