题目描述
胖老鼠准备M磅的猫粮,准备与守卫仓库的猫交易他最爱吃的JavaBean。仓库有N个房间。第i个房间包含J[I]的JavaBeans,需要F[I]磅的猫粮交换。每个房间可以按比例部分交换,你的任务是计算胖老鼠能获得的最多的JavaBeans。
输入格式
输入数据有多组,每组数据第一行包括两个正整数M、N,接下来有N行,每行有两个数J[I]和F[I],表示第i个房间JavaBean数量和需要的猫粮数量。当M和N都为-1输入结束。所有数字不会超过1000。
输出格式
对于每组输入数据,计算胖老鼠能获得的最大JavaBean数量并输出,结果保留三位小数,每个输出占一行。
样例输入
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.Arrays;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
double M = sc.nextInt();
int N = sc.nextInt();
if (M == -1 && N == -1) {
break;
}
A arr[] = new A[N];
for (int i = 0; i < N; i++) {
arr[i] = new A();
arr[i].setJavaBeans(sc.nextDouble());
arr[i].setCatFood(sc.nextDouble());
}
Arrays.sort(arr);
int k = 0;
double sum = 0;
while (M >= 0 && k < N) {
double catFood = arr[k].catFood;
if (M - catFood >= 0) {
sum += arr[k].JavaBeans;
M -= catFood;
} else {
double bili = arr[k].JavaBeans / arr[k].catFood;
sum += M * bili;
M = 0;
}
k++;
}
System.out.printf("%.3f\n", sum);
}
}
}
class A implements Comparable<A> {
double JavaBeans;
double catFood;
public A() {}
public void setJavaBeans(double javaBeans) {
JavaBeans = javaBeans;
}
public void setCatFood(double catFood) {
this.catFood = catFood;
}
@Override
public int compareTo(A o) {
return Double.compare(o.JavaBeans / o.catFood, this.JavaBeans / this.catFood);
}
}