问题描述
胖老鼠准备了M磅的猫粮,准备与守卫仓库的猫交易,里面装着他最喜欢的食物JavaBean。
仓库有N个房间。第 i 个房间包含 J[i] 磅的 JavaBeans,需要 F[i] 磅的猫粮。FatMouse 不必交易房间里的所有 JavaBeans,相反,如果他支付 F[i]* a% 磅的猫粮,他可能会得到 J[i]* a% 磅的 JavaBeans。这里的 a 是一个实数。现在他给你布置了这个作业:告诉他他可以获得的最大 JavaBeans 数量。
仓库有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();
}
}
}