题目描述
恰逢 HH国国庆,国王邀请nn 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 nn 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
输入格式
第一行包含一个整数nn,表示大臣的人数。
第二行包含两个整数 aa和 bb,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 nn行,每行包含两个整数aa 和 bb,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
输出格式
一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
输入输出样例
输入 #1复制
3 1 1 2 3 7 4 4 6输出 #1复制
2说明/提示
【输入输出样例说明】
按11、22、33 这样排列队伍,获得奖赏最多的大臣所获得金币数为 22;
按 11、33、22 这样排列队伍,获得奖赏最多的大臣所获得金币数为22;
按 22、11、33 这样排列队伍,获得奖赏最多的大臣所获得金币数为 22;
按22、33、11这样排列队伍,获得奖赏最多的大臣所获得金币数为99;
按 33、11、22这样排列队伍,获得奖赏最多的大臣所获得金币数为 22;
按33、22、11 这样排列队伍,获得奖赏最多的大臣所获得金币数为 99。
因此,奖赏最多的大臣最少获得 22个金币,答案输出 22。
【数据范围】
对于 20%的数据,有 1≤ n≤ 10,0 < a,b < 81≤n≤10,0<a,b<8;
对于 40%的数据,有1≤ n≤20,0 < a,b < 81≤n≤20,0<a,b<8;
对于 60%的数据,有 1≤ n≤1001≤n≤100;
对于 60%的数据,保证答案不超过 10^9109;
对于 100%的数据,有 1 ≤ n ≤1,000,0 < a,b < 100001≤n≤1,000,0<a,b<10000。
NOIP 2012 提高组 第一天 第二题
贪心加高精,如何判断贪心的条件是一个问题;需要证明,我太懒了,就不正了,截个图吧
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=sc.nextInt();
P[] ch=new P[n+1];
ch[0]=new P();
ch[0].l=sc.nextInt();
ch[0].r=sc.nextInt();
for(int i=1;i<=n;i++) {
ch[i]=new P();
ch[i].l=sc.nextInt();
ch[i].r=sc.nextInt();
}
Comparator<P> cmp=new Comparator<P>() {
@Override
public int compare(P o1, P o2) {
// TODO Auto-generated method stub
return o1.l*o1.r-o2.l*o2.r;
}
};
Comparator<BigDecimal> cmp1=new Comparator<BigDecimal>() {
@Override
public int compare(BigDecimal o1, BigDecimal o2) {
// TODO Auto-generated method stub
return o2.compareTo(o1);
}
};
Arrays.sort(ch, 1, n+1, cmp);
LinkedList<BigDecimal> list=new LinkedList<BigDecimal>();
BigDecimal ans=BigDecimal.ONE;
for(int i=0;i<n;i++) {
ans=ans.multiply(BigDecimal.valueOf(ch[i].l));
BigDecimal a=ans.divideToIntegralValue(BigDecimal.valueOf(ch[i+1].r));
list.add(a);
}
Collections.sort(list, cmp1);
System.out.println(list.get(0));
}
}
class P{
int l;
int r;
}