4110.圣诞老人的礼物

这道题其实不难 难就难在有一些知识点没学 所以就花了很多时间来思考 怎么存放数据
一开始我是用了一个二维数组 后面就改成了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();
	}
}
原文地址:https://www.cnblogs.com/cznczai/p/11147928.html