[贪心][高精]P1080 国王游戏(整合)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[贪心][高精]P1080 国王游戏(整合)相关的知识,希望对你有一定的参考价值。

题目描述

恰逢 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 < a、b < 8;

对于 40%的数据,有 1≤ n≤20,0 < a、b < 8;

对于 60%的数据,有 1≤ n≤100;

对于 60%的数据,保证答案不超过 10^9;

对于 100%的数据,有 1 ≤ n ≤1,000,0 < a、b < 10000。

NOIP 2012 提高组 第一天 第二题

思路

贪心+高精

1.有关贪心证明 : 

技术分享
 1 1.证明:
 2 
 3 1)知道,如果相邻的两个人交换位置,只会影响到这两个人的值,不会影响他人
 4 
 5 2)假设相邻的两个人i, i + 1。设A[i] B[i] <= A[i + 1] B[i + 1],i之前所有人的左手乘积为S。
 6 
 7 则,ans1 = max{S / B[i], S * A[i] / B[i + 1]}
 8 
 9 若交换
10 
11 则,ans2 = max{S / B[i + 1], S * A[i + 1] / B[i]}
12 
13 因为,A[i] B[i] <= A[i + 1] B[i + 1]
14 
15 所以,S A[i] / B[i + 1] <= S A[i + 1] / B[i]
16 
17 又因为,S / B[i + 1] <= S * A[i] / B[i + 1]
18 
19 所以,ans2 = S * A[i + 1] / B[i]
20 
21 ans1 = max{S / B[i], S * A[i] / B[i + 1]}
22 
23 所以,ans1 <= ans2
24 
25 2.证明:
26 
27 取 log 变成加法.
28 
29 其实只与相邻两人的顺序有关.
30 前后的人他们都影响不了.
31 推一推式子. 假设有俩人 i,j.
32 i 在 j 前面的答案是
33 max{−b i ,a i − b j }
34 i 在 j 后面的答案是
35 max{−b j ,a j − b i }
36 
37 显然 −b j < a i − b j ,−b i < a j − b i .
38 所以 a i − b j < a j − b i .
39 所以 a i + b i < a j + b j
来源:http://www.cnblogs.com/zwfymqz/p/7297446.html(自为风月马前卒)

2.核心代码:

技术分享
 1     std::sort(a + 2, a + 2 + n, cmp);//按贪心思路排序
 2     s[0] = 1;s[1] = 1;//初始化2以前
 3     for(int i = 2;i <= n + 1;i ++)
 4     {
 5         memset(tmp, 0, sizeof(tmp));
 6         cheng(a[i - 1].l);//i以前左值之积
 7         chu(a[i].r);//除以i右值
 8         bijiao();//更新值
 9     }
10     put();//倒序输出
来源:http://www.cnblogs.com/huibixiaoxing/p/6905779.html#undefined(Secret缄墨)

 

以上是关于[贪心][高精]P1080 国王游戏(整合)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1080(NOIP2012)国王游戏——贪心排序与高精度

[高精度][贪心]Luogu P1080 国王游戏

luogu P1080 国王游戏

luogu P1080 国王游戏

AC日记——国王游戏 洛谷 P1080

国王游戏 2012年NOIP全国联赛提高组(贪心+高精)