这道题我没有压位的高精度都能在几十ms内ak,看来高精度的题的确效率要求是比较宽松的。

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void trunc_zero(vector<int> &num) {
    while (num.empty() == false && num.back() == 0)
        num.pop_back();
}

struct Person {
    int lh;
    int rh;
    int mul;
} people[10002];

enum class Order { Equal, Less, Greater };

class Big_unsigned {
    friend ostream &operator<<(ostream &os, Big_unsigned const &a);
    vector<int> digits;

  public:
    Big_unsigned(string const &str) {
        digits.resize(str.size());
        auto i = digits.begin();
        auto j = str.rbegin();
        auto ed = digits.end();
        while (i != ed) {
            *i++ = *j++ - '0';
        }
    }

    Big_unsigned(vector<int> &&num) : digits(num) {}

    Big_unsigned operator*(int const a) const {
        vector<int> num(digits.size() + 10, 0);
        size_t i = 0;
        for (; i < digits.size(); ++i) {
            num[i] += digits[i] * a;
            if (num[i] >= 10) {
                num[i + 1] += num[i] / 10;
                num[i] %= 10;
            }
        }
        while (num[i] >= 10) {
            num[i + 1] += num[i] / 10;
            num[i] %= 10;
            ++i;
        }
        trunc_zero(num);
        return {move(num)};
    }

    Big_unsigned operator*(Big_unsigned const &a) const {
        vector<int> num(digits.size() + a.digits.size(), 0);
        size_t k;
        for (size_t i = 0; i < digits.size(); ++i) {
            for (size_t j = 0; j < a.digits.size(); ++j) {
                k = i + j;
                num[k] += digits[i] + a.digits[j];
                if (num[k] >= 10) {
                    num[k + 1] += num[k] / 10;
                    num[k] %= 10;
                }
            }
        }
        trunc_zero(num);
        return {std::move(num)};
    }

    Big_unsigned operator/(int const a) const {
        vector<int> num(digits.size());
        int accum = 0;
        for (int i = digits.size() - 1; i >= 0; --i) {
            accum = accum * 10 + digits[i];
            num[i] = accum / a;
            accum %= a;
        }
        trunc_zero(num);
        return {std::move(num)};
    }

    Order cmp(Big_unsigned const &a) const {
        if (digits.size() < a.digits.size()) {
            return Order::Less;
        } else if (digits.size() > a.digits.size()) {
            return Order::Greater;
        } else {
            auto i = digits.rbegin();
            auto j = a.digits.rbegin();
            auto ed = digits.rend();
            while (i != ed) {
                if (*i < *j) {
                    return Order::Less;
                } else if (*i > *j) {
                    return Order::Greater;
                } else {
                    ++i, ++j;
                }
            }
            return Order::Equal;
        }
    }
};

ostream &operator<<(ostream &os, Big_unsigned const &a) {
    if (a.digits.size() == 0) {
        os << '0';
    } else {
        auto i = a.digits.rbegin();
        auto ed = a.digits.rend();
        while (i != ed) {
            os << *i;
            ++i;
        }
    }
    return os;
}

int main() {
    int n;
    cin >> n;
    cin >> people[0].lh >> people[0].rh;
    people[0].mul = people[0].lh * people[0].rh;
    for (int i = 1; i <= n; ++i) {
        cin >> people[i].lh >> people[i].rh;
        people[i].mul = people[i].lh * people[i].rh;
    }
    sort(people + 1, people + 1 + n, [](Person a, Person b) { return a.mul < b.mul; });
    Big_unsigned accum(to_string(people[0].lh));
    Big_unsigned max_num(to_string(people[0].lh / people[1].rh));
    for (int i = 2; i <= n; ++i) {
        accum = accum * people[i - 1].lh;
        Big_unsigned temp = accum / people[i].rh;
        if (temp.cmp(max_num) == Order::Greater)
            max_num = std::move(temp);
    }
    cout << max_num << '\n';
}