ACWING114. 国王游戏(贪心,Java)

恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。

首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。

然后,让这 n 位大臣排成一排,国王站在队伍的最前面。

排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:

排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。

注意,国王的位置始终在队伍的最前面。

输入格式
第一行包含一个整数 n,表示大臣的人数。

第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。

接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

输出格式
输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

数据范围
1≤n≤1000
0<a,b<10000
输入样例:
3
1 1
2 3
7 4
4 6
输出样例:
2

思路:
按照大臣左右手成绩排序就好了,这个可以用交换的方式证明。
这里使用了java大整数实现(copy了洛谷的代码)。

//package tdm;

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 = new Scanner(System.in);
    int n;
    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(){
        Arrays.sort(ministers,1,n + 1,new Comparator<Minister>(){
            public int compare(Minister x1,Minister x2){
                return (x1.getLeft() * x1.getRight() - x2.getLeft() * x2.getRight());
            }
        });

        BigInteger prev = new BigInteger(String.valueOf(ministers[0].getLeft()));

        BigInteger mx = BigInteger.ZERO;
        for(int i = 1;i <= n;i++){
            if(prev.compareTo(new BigInteger(String.valueOf(ministers[i].getRight()))) < 0){
                if(new BigInteger("1").compareTo(mx) > 0){
                    mx = new BigInteger("1");
                }
            } else {
                BigInteger tmp = prev.divide(new BigInteger(String.valueOf(ministers[i].getRight())));
                if(tmp.compareTo(mx) > 0){
                    mx = tmp;
                }
            }
            prev = prev.multiply(new BigInteger(String.valueOf(ministers[i].getLeft())));
        }
        System.out.println(mx);
    }

    public static void main(String[] args){
        Main solve = new Main();
        solve.input();
        solve.process();
    }
}
发布了756 篇原创文章 · 获赞 27 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/104517761