题解 P1080 【国王游戏】

officeyutong

2017-10-30 22:33:48

Solution

看到诸位dalao还没有发java题解的,我这种蒟蒻先来发一个好了233 ```java //用java当然是为了用BigInteger 233 import java.math.BigInteger; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; //表示一个大臣 class Minister { private int left; private int right; public Minister(int left, int right) { this.left = left; this.right = right; } public int getLeft() { return left; } public void setLeft(int left) { this.left = left; } public int getRight() { return right; } public void setRight(int right) { this.right = right; } } public class Main { //数据量不大 出于偷懒考虑直接用Scanner Scanner scanner = new Scanner(System.in); //题目所述的n int n; //存储各个大臣所对应的数据 0下标对应国王 Minister ministers[]; public void input() { n = scanner.nextInt(); ministers = new Minister[n + 1 + 1]; for (int i = 0; i <= n; i++) { ministers[i] = new Minister(scanner.nextInt(), scanner.nextInt()); } } public void process() { //对大臣进行排序 为什么要这样下面的cpp大佬们已经说的很清楚了 //Arrays.sort(T[],a,b,Comparator) 对[a,b)区间进行排序 Arrays.sort(ministers, 1, n + 1, new Comparator<Minister>() { @Override public int compare(Minister o1, Minister o2) { return (o1.getLeft() * o1.getRight() - o2.getLeft() * o2.getRight()); } }); //计算到第i个大臣的时候 之前所有大臣左手上的数字的乘积(包括国王) //题外话:为什么BigInteger没有BigInteger(int source)这个构造函数.. BigInteger prev = new BigInteger(String.valueOf(ministers[0].getLeft())); //计算到第i个大臣时 前面所有大臣中所获的金钱最多的数目 BigInteger max = BigInteger.ZERO; for (int i = 1; i <= n; i++) { //特判 如果当前大臣所获得的金钱不足1 则改为1 if (prev.compareTo(new BigInteger(String.valueOf(ministers[i].getRight()))) < 0) { if (new BigInteger("1").compareTo(max) > 0) { max = new BigInteger("1"); } } else { BigInteger int1 = prev.divide(new BigInteger(String.valueOf(ministers[i].getRight()))); if (int1.compareTo(max) > 0) { max = int1; } } prev = prev.multiply(new BigInteger(String.valueOf(ministers[i].getLeft()))); } System.out.println(max); } public static void main(String[] args) { Main app = new Main(); app.input(); app.process(); } } ```