【NOIP2012提高组 国王游戏】

题目背景

NOIP2012提高组DAY1试题。

题目描述

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

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

输入格式

第一行包含一个整数 n,表示大臣的人数。
第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

输出格式

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

样例数据 1

输入

3
1 1
2 3
7 4
4 6

输出

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<a、b<8;
对于 40% 的数据,有 1≤n≤20,0<a、b<8;
对于 60% 的数据,有 1≤n≤100;
对于 60% 的数据,保证答案不超过 109
对于 100% 的数据,有 1≤n≤1,000,0<a、b<10000。

假设共有 n 位大臣,第 i 个大臣左手上面的数记为Li,第i个大臣右手上面的数记为Ri,又记:

我们先来考虑怎样让排在队伍最后一位大臣的奖赏最少。

假设第 j 个大臣排在队伍最后,那么此时他可以获得的奖赏为 S/(Lj*Rj)。我们自然得出:若把 n 个大臣中,(Li*Ri)最大的一位大臣,放在队伍最后,那么就可以让最后一位大臣的获奖最少。

我们再来考虑,如何让所有大臣中获奖最多的大臣获奖最少呢?
我们贪心的来做,每次都使得当前位于队伍最后的一位大臣所获奖赏最少。每当考虑完最后一位大臣后就把这个大臣从队伍中忽略,直到考虑完所有位置上面的大臣。此时,我们惊奇地发现大臣们所排成的队伍,就是依据(Li*Ri)的大小,将每一个大臣按照从小到大的顺序从前向后排列,所形成的队伍。

综上,我们只需将大臣们按照(Li*Ri),从小到大的顺序从前向后排列,并计算出获得的奖赏最大值输出即可。
此问题时间复杂度为 O(N*log2N)。

哎……这道题还有个萎靡的问题,就是高精度,如果不用高精度的话只能过70%,被困扰了很久……

下面是代码:

stdKonjac

stdKonjac

一只挣扎的蒟蒻ACMer

评论太激烈有些评论需要亲动动手指翻页

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

*