贪心妙题蛙
开始看到最大值最小化,还以为是二分... 最后证明是我太 naive 了
先设 \(A_i\)为 \(i\) 左手上的数字,\(B_i\) 为 \(i\) 右手上的数字,下标为 \(0\) 的是国王的数字
然后如果
\[ \max \lbrace \frac{1}{B_i}*\prod_{j=0}^{i-1} A_j,\frac{A_i}{B_{i+1}}*\prod_{j=0}^{i-1} A_j\rbrace>\max \lbrace \frac{A_{i+1}}{B_i}*\prod_{j=0}^{i-1} A_j,\frac{1}{B_{i+1}}*\prod_{j=0}^{i-1} A_j\rbrace \]
那么第 \(i\) 个大臣和第 \(i+1\) 个大臣交换是有可能使得解更优的。
然后把 \(\prod_{j=0}^{i-1} A_j\) 这个东西丢掉以后,再将两边都同时乘上 \(B_i*B_{i+1}\),就只需要比较下面这个式子
\[ \max \lbrace B_{i+1},A_i*B_i\rbrace>\max \lbrace A_{i+1}*B_{i+1},B_i \rbrace \]
因为每个大臣手上的数字都是正整数,所以可以得到以下不等式
- \(A_i*B_i>B_i\)
- \(A_{i+1}*B_{i+1}>B_{i+1}\)
所以如果当 \(\max \lbrace B_{i+1},A_i*B_i\rbrace>\max \lbrace A_{i+1}*B_{i+1},B_i \rbrace\) 时,\(A_i*B_i>A_{i+1}*B_{i+1}\)
只要将 \(A_i*B_i\) 当关键字排下序就一定是最优的顺序了。
注意写高精
下面的代码为了美观,就直接贴上 \(60\,pts\) 的无高精代码好了 qwq
#include <iostream>
#include <cstdio>
#include <algorithm>
const int max_n = 1000 + 5;
struct Node
{
int a, b, c;
}P[max_n];
int N, Ans;
bool cmp(Node x, Node y)
{
return x.c < y.c;
}
int main()
{
int mul = 1;
std::cin >> N;
std::cin >> P[0].a >> P[0].b;
for(int i = 1; i <= N; ++i)
{
std::cin >> P[i].a >> P[i].b;
P[i].c = P[i].a * P[i].b;
}
std::sort(&P[1], &P[N + 1], cmp);
for(int i = 1; i <= N; ++i)
{
mul *= P[i - 1].a;
if(mul / P[i].b > Ans) Ans = mul / P[i].b;
}
std::cout << Ans;
return 0;
}