zoukankan      html  css  js  c++  java
  • 洛谷P1080 国王游戏

    题目链接:https://www.luogu.org/problem/P1080

    该题贪心策略直接将左手金币数*右手金币数小的排在前面即可

    为什么这样洛谷题解讲的很清楚了

    这篇题解只为属性java大数使用,够直接照搬了大佬的代码

    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();
        }
    
    }
  • 相关阅读:
    netstat
    Android总结篇——Intent机制详解及示例总结
    Android系统介绍与框架
    三个绘图工具类详解
    Android 调用 WebService
    Android JSON数据解析
    Android 总结:ContentProvider 的使用
    Android Service完全解析,关于服务你所需知道的一切(下)
    Android Service完全解析,关于服务你所需知道的一切(上)
    Activity的四种加载模式详解:
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/11589328.html
Copyright © 2011-2022 走看看