NOIP 贪心 国王游戏

https://www.luogu.org/problemnew/show/P1080

题目描述

恰逢 HH国国庆,国王邀请nn 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 nn 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

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

输入输出格式

输入格式:

第一行包含一个整数nn,表示大臣的人数。

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

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

输出格式:

一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

输入输出样例

输入样例#1:  复制
3 
1 1 
2 3 
7 4 
4 6 
输出样例#1:  复制
2

说明

【数据范围】

对于 20%的数据,有 1≤ n≤ 10,0 < a,b < 81n10,0<a,b<8;

对于 40%的数据,有1≤ n≤20,0 < a,b < 81n20,0<a,b<8;

对于 60%的数据,有 1≤ n≤1001n100;

对于 60%的数据,保证答案不超过 10^9109;

对于 100%的数据,有 1 ≤ n ≤1,000,0 < a,b < 100001n1,000,0<a,b<10000。

NOIP 2012 提高组 第一天 第二题

做法

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.math.BigInteger;

class node implements Comparable {
    public int left;
    public int right;

    @Override
    public int compareTo(Object n) {
        node that = (node) n;
        return Integer.valueOf(this.left).compareTo(Integer.valueOf(that.left));
    }

}

public class hello {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();
        node gg = new node();
        // node []aa=new node[1005];
        int a=in.nextInt();
        int bb=in.nextInt();
        //List<node> aa = new ArrayList();
        BigInteger Max = new BigInteger(Integer.valueOf(a).toString());
        int j=0;
        BigInteger sum = new BigInteger(Integer.valueOf(a).toString());
        for (int i = 0; i < num; i++) {
            gg.left = in.nextInt();
            gg.right = in.nextInt();
            BigInteger a1 = new BigInteger(Integer.valueOf(gg.left).toString());
            BigInteger a2 = new BigInteger(Integer.valueOf(gg.right).toString());
            
            if(!Max.equals(Max.max(a1.multiply(a2))))
            {
                Max=Max.max(a1.multiply(a2));
              
            }
            sum = sum.multiply(a1);
            
        }
        sum=sum.divide(Max);
        if(sum.equals(new BigInteger("0"))) sum=new BigInteger("1");
        System.out.println(sum);
    }
}

做法: 

假设 左手a[i] 右手b[i] 则 求a[i]* b[i] 的最大值Max

sum=a[i] 的连乘

答案就是 sum/Max

要注意sum/Max 向下取整为0时,要取1

原理:

首先获得奖赏最多的大臣一定在最后

其次 他所获得的奖赏一定是所有人(除他以外)的左手的数相乘  除以  他自己的右手

所以 

将所有人 的左手相乘   除以 他的左手 ==  所有人(除他以外)的左手的数相乘

他所获得的奖赏 ==将所有人 的左手相乘   除以 他的左手  再除以 他自己的右手 

==所有人 的左手相乘 /(他的左手*右手)

而所有人 的左手相乘 是一个定值,只要求(他的左手*右手) 最大即可

猜你喜欢

转载自www.cnblogs.com/LandingGuy/p/9897456.html