这道题其实不难 难就难在有一些知识点没学 所以就花了很多时间来思考 怎么存放数据
一开始我是用了一个二维数组 后面就改成了Arraylist 然后进行排序
这道题并不是整箱整箱的拿 ,可以拿箱子的一部分 所以先将性价比高的拿出来
import java.util.*;
//定义一个礼物类 存放 礼物的value kg and v_k
class gift {
int val;
int kg;
double v_k ;
}
//定义一个方法
public void MAX() {
//double 统计总数量
double count = 0;
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int theMax = sc.nextInt();
//定义一个ArrayList 存放对象 因为一开始 我尝试用一个一维数组存放数据 结果发现 v_k得分开存放
List<gift> ls = new ArrayList<gift>();
int i = 0;
while (i < num) {
gift g = new gift();
g.val = sc.nextInt();
g.kg = sc.nextInt();
//不能再类里面运算 ,不然会没有数据
g.v_k = (double) g.val / g.kg;
ls.add(g);
i++;
}
//这道题主要的核心我觉得是下面这个 之前没学 ,不知道java内置的ArrayList 排序方法
ls.sort(new Comparator<gift>() {
@Override
public int compare(gift o1, gift o2) {
if ((o1.v_k - o2.v_k) <= 1e-6 && (o1.v_k - o2.v_k) > 0)
return 0;
else if ((o1.v_k - o2.v_k) > 1e-6)
return -1;
else
return 1;
}
//调整1/-1 的值就可以让Arraylist 升序排序还是降序
});
//for each 遍历 查看是否为从大到小
// for(gift e : ls) {
// System.out.println(e.v_k);
// }
for(int temp = 0;temp < ls.size();temp++ ) {
gift g = ls.get(temp);
if(g.kg <= theMax) {
count += g.val;
}
else if(g.kg > theMax ) {
count += theMax * g.v_k;
break;
}
theMax -= g.kg;
}
System.out.printf("%.1f", count);
}
public static void main(String[] args) {
Main m = new Main();
m.MAX();
}
}