聖誕老人的禮物 ---貪心

聖誕老人的禮物 ---貪心

這道題其實不難 難就難在有一些知識點沒學 所以就花了很多時間來思考 怎麼存放數據
一開始我是用了一個二維數組 後面就改成了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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章