异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章仅在CSDN和个人博客(一定是异想之旅域名)发布,除此之外全部是盗文!
恰逢 $H 国 国 庆 , 国 王 邀 请 国国庆,国王邀请 国国庆,国王邀请 n$ 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n n n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
第一行包含一个整数 n n n,表示大臣的人数。
第二行包含两个整数 a a a 和 b b b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n n n 行,每行包含两个整数 a a a 和 b b b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
In 1:
3 1 1 2 3 7 4 4 6
Out 1:
2
由于本题特殊情况较多,这里多给出2个样例(分别为洛谷评测样例 #6 和 #7)方便调试
In 3:
100 70 94 43 9 92 18 18 9 86 31 24 32 46 49 23 69 40 56 27 75 28 85 37 29 99 80 44 70 14 9 30 38 46 32 93 87 42 49 35 60 99 73 57 8 38 35 73 33 6 32 10 36 78 75 49 98 50 48 91 78 18 3 86 24 18 84 27 28 83 25 15 95 38 18 50 89 79 9 3 17 1 52 74 32 76 99 24 36 9 43 93 7 65 27 36 84 75 31 94 44 33 2 85 5 42 18 4 33 45 84 92 87 86 34 36 44 61 59 59 28 1 97 60 23 9 64 96 47 57 100 90 7 54 93 17 30 71 23 72 32 14 95 48 40 27 15 92 78 52 11 93 21 56 60 22 47 21 58 89 11 29 13 36 14 95 91 47 12 16 36 19 80 19 92 73 68 66 1 53 97 13 60 83 5 63 99 98 37 2 67 84 95 26 60 63 33 2 78 91 38 9 31
Out 3:
2166489661101032350678866897536628698296804147316726878162441737980268621335310233327258927458239967674879428851028800069063620140885606400000000000000000
In 4:
100 1 1 1 1 2 1 2 2 1 2 1 2 2 2 1 2 1 2 2 2 2 2 1 2 2 1 1 2 1 2 1 2 1 2 2 2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 2 1 2 2 2 1 1 1 2 1 1 1 2 2 2 1 2 1 2 2 2 2 2 1 2 1 2 2 1 1 2 1 1 1 2 1 1 2 1 2 2 1 1 2 2 1 1 2 2 1 2 2 2 1 2 2 2 1 2 1 2 2 2 1 2 2 2 1 2 1 2 1 1 2 1 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 1 2 2 1 2 2 1 2 2 1 2 1 1 1 2 1 1 1 2 1 2 2 2 1 2 1 1 1 1 2 2 1 2 2 2 2 1 1 2 2 1 1 2 1 2 2 2 1 2 1 2 1 2 1 1 1 2
Out 4:
268435456
对于 20%的数据,有 1 ≤ n ≤ 10 , 0 < a , b < 8 1≤ n≤ 10, 0 < a,b < 8 1≤n≤10,0<a,b<8;
对于 40%的数据,有 1 ≤ n ≤ 20 , 0 < a , b < 8 1≤ n≤20, 0 < a,b < 8 1≤n≤20,0<a,b<8;
对于 60%的数据,有 1 ≤ n ≤ 100 1≤ n≤100 1≤n≤100;
对于 60%的数据,保证答案不超过 1 0 9 10^9 109;
对于 100%的数据,有 1 ≤ n ≤ 1 × 1 0 3 , 0 < a , b < 1 × 1 0 4 1 ≤ n ≤1\times10^3, 0 < a,b < 1\times10^4 1≤n≤1×103,0<a,b<1×104。
对于100%的数据,看 Out 3 样例中输出的数字就知道了,高精度逃不过……本题中需要自己实现高精度乘法、高精除以int除法、高精度数字大小比较等。同时,高精度操作来操作去对C++字符串操作的熟悉程度也有很高要求。
另外就是大家都可以想到的,计算前一定要排序,且一定是一个贪心算法。接下来就来推理贪心的公式:
证毕。
我敢说我比任何题解证得好
但是此处需要注意一件事!
就是题目中提到了的 sort cmp 函数使用警告——cmp函数的比较符必须是开区间!具体见下面这个例子
bool cmp(int a, int b) { // 错误 // return a >= b; // 正确 return a > b; }
使用闭区间,否则Windows会莫名退出,Linux显示错误信息 Segmentation fault
外无更多提示。
如果想要研究原理,可以看看这两个文章(蒟蒻看不懂):