题目并不难,http://www.patest.cn/contests/pat-b-practise/1020 。
1020. 月饼 (25)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。
输入样例:3 20 18 15 10 75 72 45输出样例:
94.50
关键问题是要注意两个点:
(1)注意库存可能不是整数(测试点2)
(2)可能库存不够( 测试点3)
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
class Pie
{
double num ;
double price ;
@Override
public String toString() {
return "Pie [num=" + num + ", price=" + price + "]";
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int typeNum= scanner.nextInt();
double need = scanner.nextInt();
ArrayList<Pie> pies = new ArrayList<Pie>();
for(int i=0;i<typeNum;++i)
{
Pie pie = new Pie();
pie.num = scanner.nextDouble();
pies.add(pie);
}
for(int i=0;i<typeNum;++i)
{
pies.get(i).price = (double)scanner.nextDouble()/pies.get(i).num;
}
Collections.sort(pies,new Comparator<Pie>() {
public int compare(Pie o1, Pie o2) {
if(o1.price>o2.price)
return -1;
else if(o1.price<o2.price)
return 1;
else return 0;
}
});
int index = 0;
double sum =0;
while(need>0 && index<typeNum)
{
Pie pie = pies.get(index);
if(pie.num>need)
{
sum = sum+need*pie.price;
}
else
{
sum = sum+pie.num*pie.price;
}
need = need-pie.num;
index++;
}
DecimalFormat df = new DecimalFormat("#0.00");
System.out.println(df.format(sum));
}
}
题目有误导,容易用整型int
参考了一下 http://www.xuebuyuan.com/2063911.html 才把int 改成double