恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
第一行包含一个整数 n,表示大臣的人数。
第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
输入 #1
3 1 1 2 3 7 4 4 6
输出 #1
2
【输入输出样例说明】
按 1、2、3 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;
按 1、3、2 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;
按 2、1、3 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;
按 2、3、1这样排列队伍,获得奖赏最多的大臣所获得金币数为 9;
按 3、1、2 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;
按 3、2、1 这样排列队伍,获得奖赏最多的大臣所获得金币数为 9。
因此,奖赏最多的大臣最少获得 2 个金币,答案输出 2。
【数据范围】
对于 20% 的数据,有 1≤n≤10,0
对于 40% 的数据,有1≤n≤20,0
对于 60% 的数据,有 1≤n≤100; 对于 60% 的数据,保证答案不超过 ; 对于 100% 的数据,有 1≤n≤1,000,0
看到这题标签:贪心。于是就想:怎么贪呢? 这道题70多行代码,其中的贪心只有5行,但这却是本题最难的部分。 开始推导:假设已经排了几个人(包括国王),设他们左手上的数的乘积为S。 现在要给2个人排序,记第一个人左手上的数为a1,右手上的数为b1;第二个人左手上的数为a2,右手上的数为b2。 如果第一个人排在前面优于第二个人排在前面,那么 max(S/b1,S∗a1/b2) 而又由于a1,b1,a2,b2,S>0,所以 S/b2≤S∗a1/b2。 假如S∗a1/b2≥S∗a2/b1,则显然max(S/b1,S∗a1/b2)≥max(S/b2,S∗a2/b1),矛盾。 所以S∗a1/b2 只需将数组按照a*ba∗b从小到大排序即可。 这道题高精还是挺复杂的。 本题需要支持复制、比较、乘、除44种高精度操作(当然也有输出)。 复制:没什么好说的,一位一位赋值就好了。 比较:也没什么好说的,从高位到低位比较即可,注意是bool类型。 乘法:注意先从高到低乘一遍,再从低到高进位。 除法:要用一个数记录,和快读差不多。 附上代码—— 总要点个赞再走呀~题解
贪心
a1∗b1高精度
代码
相信你们都会看到这里。。。