這道題其實不難 難就難在有一些知識點沒學 所以就花了很多時間來思考 怎麼存放數據
一開始我是用了一個二維數組 後面就改成了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();
}
}