PAT(B) 1020 月饼(Java)

题目链接:1020 月饼 (25 point(s))
分析
  • 月饼(库存量,总售价,单价)封装成MoonCake
  • Scanner会超时,用BufferedReader类读取数据
    • 读取的时候用字符串数组保存,见input()方法
  • 将读取的字符串转成int型和double型,见transform()方法
  • 自定义MyComparator类实现Comparator接口,将月饼按照单价降序排序
  • 顺序卖出月饼,直到满足最大需求量或者所有月饼全部卖出,即可得到最大收益
代码
/**
 * Score 25
 * Run Time 119ms
 * @author wowpH
 * @version 2.2
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class Main {
	private int n, d;			// 月饼种类,最大需求量
	private MoonCake[] moon;	// 月饼

	// n和d,月饼库存量,月饼总售价
	private String[] nd, stock, price;

	public Main() {
		input();		// 输入
		transform();	// 转换
		MyComparator c = new MyComparator();
		Arrays.sort(moon, c);	// 排序

		double sum = 0;	// 最大收益
		int i = 0;
		while (i < n && d > 0) {
			if (d < moon[i].stock) {
				sum += d * moon[i].utilPrice;// 第i种月饼卖出d万吨
			} else {
				sum += moon[i].totalPrice;	// 第i种月饼全部卖完
			}
			d -= moon[i].stock;	// 市场的剩余需求量
			i++;
		}

		System.out.printf("%.2f
", sum);	// 输出最大收益
	}

	// 输入
	private void input() {
		InputStreamReader ir = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(ir);
		try {
			nd = br.readLine().split(" ");
			stock = br.readLine().split(" ");
			price = br.readLine().split(" ");
			br.close();
		} catch (IOException e) {
			System.out.println("输入错误!");
		}
	}

	// 将字符串数组类型的数据转换成int型和double型
	private void transform() {
		n = Integer.parseInt(nd[0]);
		d = Integer.parseInt(nd[1]);

		moon = new MoonCake[n];
		for (int i = 0; i < n; i++) {
			moon[i] = new MoonCake();
			moon[i].stock = Double.parseDouble(stock[i]);
			moon[i].totalPrice = Double.parseDouble(price[i]);
			moon[i].utilPrice = moon[i].totalPrice / moon[i].stock;
		}
	}

	public static void main(String[] args) {
		new Main();
	}
}

final class MoonCake {
	public double stock;// 库存量
	public double totalPrice;// 总售价
	public double utilPrice;// 单价
}

final class MyComparator implements Comparator<MoonCake> {
	// 单价降序排序
	@Override
	public int compare(MoonCake o1, MoonCake o2) {
		if (o1.utilPrice < o2.utilPrice) {
			return 1;
		} else if (o1.utilPrice > o2.utilPrice) {
			return -1;
		}
		return 0;
	}
}

版权声明:

  1. 转载请于首页注明链接形式的PAT(B) 1020 月饼(Java)——wowpH
  2. 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
  3. 如果有疑问欢迎评论留言,尽量解答。

原文地址:https://www.cnblogs.com/wowpH/p/11060775.html