You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.0 KiB

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n;
struct Person {
int left, right;
} person[N];
bool cmp(const Person &a, const Person &b) {
return a.left * a.right < b.left * b.right;
}
//高精度乘法
vector<int> mul(vector<int> &A, int b) {
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i++) {
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
//高精度除法
vector<int> div(vector<int> &A, int b, int &r) {
vector<int> C;
r = 0;
for (int i = A.size() - 1; i >= 0; i--) {
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
//获取两个vector<int>中较大的那个
vector<int> max_vec(vector<int> a, vector<int> b) {
if (a.size() > b.size()) return a;
if (a.size() < b.size()) return b;
for (int i = a.size() - 1; i >= 0; i--) {
if (a[i] > b[i]) return a;
if (a[i] < b[i]) return b;
}
return a;
}
int main() {
//优化输入
ios::sync_with_stdio(false);
cin >> n;
//输入
for (int i = 0; i <= n; i++)
cin >> person[i].left >> person[i].right;
//排序,国王不参加排序
sort(person + 1, person + n + 1, cmp);
//连乘各放入国王
vector<int> lcj;
lcj.push_back(person[0].left);
//结果
vector<int> res;
res.push_back(0);//在做高精度时,也需要进行一步初始化
for (int i = 1; i <= n; i++) {
int r;//余数,本题中因为只需要下取整,所以余数无意义
res = max_vec(res, div(lcj, person[i].right, r));
lcj = mul(lcj, person[i].left);
}
//倒序输出高精度数组中的值
for (int i = res.size() - 1; i >= 0; i--)
printf("%d", res[i]);
return 0;
}