1. 程式人生 > >PAT 乙級 1020 月餅 (25分)Java實現

PAT 乙級 1020 月餅 (25分)Java實現

原題連結:月餅

1. 題意

題意比較明瞭,就是讓我們求最大的收益

2. 思路

這道題用Java寫要注意兩個地方

  1. 輸入的時候不能使用Scanner類,因為輸入的資料比較多,使用Scanner輸入會很慢,所以我們要用BufferedReader類,得到字串後,再轉為double型計算
  2. 輸出保留兩位小數,Java的做法:String.format("%.2f", sum)

3. 程式碼

package bas1020;

import java.io.BufferedReader;
import java.io.IOException;
import
java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; public class Main { static class Cake implements Comparable<Cake>{ double amount; double price; double value; public Cake(double amount, double price, double value)
{ this.amount = amount; this.price = price; this.value = value; } @Override public int compareTo(Cake o) { return value > o.value ? -1 : 1; } } public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] in = br.readLine().split(" "); int n = Integer.parseInt(in[0]); int d = Integer.parseInt(in[1]); ArrayList<Cake> list = new ArrayList<Cake>(); String[] w = br.readLine().split(" "), pr = br.readLine().split(" "); for (int i = 0; i < n; i++) { double m = Double.parseDouble(w[i]); double p = Double.parseDouble(pr[i]); double value = p/m; list.add(new Cake(m, p, value)); } Collections.sort(list); double sum = 0; for (int i = 0; i < n; i++) { if (d - list.get(i).amount >= 0) { sum += list.get(i).price; d -= list.get(i).amount; } else { sum += list.get(i).value * d; break; } } System.out.println(String.format("%.2f", sum)); } }

測試圖:
在這裡插入圖片描述