- 这道题其实不难 难就难在有一些知识点没学 所以就花了很多时间来思考 怎么存放数据
- 一开始我是用了一个二维数组 后面就改成了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 ls = new ArrayList(); 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() { @Override public int compare(gift o1, gift o2) { if ((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(); } }