这道题我没有压位的高精度都能在几十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';
} 


京公网安备 11010502036488号