1. 程式人生 > >NOIP 貪心 國王遊戲

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

 

原理:

首先獲得獎賞最多的大臣一定在最後

其次 他所獲得的獎賞一定是所有人(除他以外)的左手的數相乘  除以  他自己的右手

所以 

將所有人 的左手相乘   除以 他的左手 ==  所有人(除他以外)的左手的數相乘

他所獲得的獎賞 ==將所有人 的左手相乘   除以 他的左手  再除以 他自己的右手 

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

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