题目
题解
假设最初时
i
i
i在
j
j
j前
选相邻的两个大臣
i
,
j
i,j
i,j,用
a
i
,
a
j
,
b
i
,
b
j
a_i,a_j,b_i,b_j
ai,aj,bi,bj来表示大臣左手上和右手上的数字,
k
k
k表示在前面的那个大臣的前面所有大臣左手数字的乘积。
当
i
i
i在
j
j
j前时答案为
max
(
k
b
i
,
k
∗
a
i
b
j
)
\max\large(\frac{k}{b_i},\frac{k*a_i}{b_j}\large)
max(bik,bjk∗ai)
当
j
j
j在
i
i
i前时答案为
max
(
k
b
j
,
k
∗
a
j
b
i
)
\max\large(\frac{k}{b_j},\frac{k*a_j}{b_i}\large)
max(bjk,bik∗aj)
若
max
(
k
b
j
,
k
∗
a
j
b
i
)
<
max
(
k
b
i
,
k
∗
a
i
b
j
)
\max(\frac{k}{b_j},\frac{k*a_j}{b_i}) < \max(\frac{k}{b_i},\frac{k*a_i}{b_j})
max(bjk,bik∗aj)<max(bik,bjk∗ai)
则需要交换
i
i
i,
j
j
j
由于
k
b
j
⩽
k
∗
a
i
b
j
,
k
b
i
⩽
k
∗
a
j
b
i
\frac{k}{b_j}\leqslant\frac{k*a_i}{b_j},\frac{k}{b_i}\leqslant\frac{k*a_j}{b_i}
bjk⩽bjk∗ai,bik⩽bik∗aj
所以我们只需要比较
a
i
b
j
,
a
j
b
i
\frac{a_i}{b_j},\frac{a_j}{b_i}
bjai,biaj
即
a
i
∗
b
i
>
a
j
∗
b
j
a_i*b_i>a_j*b_j
ai∗bi>aj∗bj
就需要交换
i
,
j
i,j
i,j
这样我们就有了
60
60
60,正解需要高精度,然而我并不会,所以只放一个
60
60
60分代码
code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e3 + 100;
template <typename T>
inline void read(T &s) {
s = 0;
T w = 1, ch = getchar();
while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); }
while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
s *= w;
}
int n, x, y;
LL ans, k;
struct node { int a, b; } p[maxn];
bool cmp(node aa, node bb) {
return aa.a * aa.b < bb.a * bb.b;
}
int main() {
read(n);
read(x), read(y);
for (int i = 1; i <= n; ++i)
read(p[i].a), read(p[i].b);
k = x;
sort(p + 1, p + n + 1, cmp);
for (int i = 1; i <= n; ++i) {
ans = max(ans, k / p[i].b);
k *= p[i].a;
}
printf("%lld", ans);
return 0;
}