PAT (Basic Level) Practice 1020 月饼
1.题目描述
2.思路及代码
思路:
很经典的一道贪心算法。统计出各月饼单价,从高到低排序,优先卖出单价高的月饼。
卖出策略描述:
①若剩余需求量不小于当前月饼的库存量,则卖出所有这种月饼
②若剩余需求量小于当前月饼的库存,则能卖多少是多少(卖出量取决于剩余需求量)
注意事项:一行中有大量数据要读入时,采用BufferedReader读入,否则易超时。
我一开始用的Scanner,5个测试点超了4个
import java.util.Arrays;
import java.io.*;
class MoonCake implements Comparable<MoonCake>{
float inventory;
float totprice;
float price;
@Override
//比较器
public int compareTo(MoonCake o) {
return (price > o.price) ? -1 : (price == o.price ? 0 : 1) ;
}
}
public class Main {
public static void main(String[] args) throws IOException{
//读入数据
int n, needs, i;
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
String line1[] = buffer.readLine().split(" ");
n = Integer.parseInt(line1[0]);
needs = Integer.parseInt(line1[1]);
//第2行
String lien2[] = buffer.readLine().split(" ");
MoonCake []mooncakes = new MoonCake[n];
for(i = 0; i < n; i++) {
mooncakes[i] = new MoonCake();
mooncakes[i].inventory = Float.parseFloat(lien2[i]);
}
//第3行
String line3[] = buffer.readLine().split(" ");
for(i = 0; i < n; i++) {
mooncakes[i].totprice = Float.parseFloat(line3[i]);
mooncakes[i].price = mooncakes[i].totprice / mooncakes[i].inventory;
}
//排序
Arrays.sort(mooncakes);
float sale = 0;
for(i = 0; i < n; i++) {
if(mooncakes[i].inventory <= needs) { //当前需求量大于此种月饼的库存量,全部卖出
sale += mooncakes[i].totprice;
needs -= mooncakes[i].inventory;
}
else { //当前需求量小于此种月饼的库存量,则部分卖出
sale += (mooncakes[i].price) * needs;
break;
}
}
System.out.printf("%.2f",sale);
}
}