PAT 乙級 1020 月餅 (25分)Java實現
阿新 • • 發佈:2018-11-25
原題連結:月餅
1. 題意
題意比較明瞭,就是讓我們求最大的收益
2. 思路
這道題用Java寫要注意兩個地方
- 輸入的時候不能使用
Scanner
類,因為輸入的資料比較多,使用Scanner
輸入會很慢,所以我們要用BufferedReader
類,得到字串後,再轉為double
型計算 - 輸出保留兩位小數,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));
}
}
測試圖: