https://www.luogu.org/problem/P1080
#include<bits/stdc++.h> using namespace std; typedef pair<int, int> PII;//pair真tm是个好东西 const int N = 1010; int n; PII p[N]; //人 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; } return C; } vector<int> div(vector<int> &A, int b) { //高精度除法 vector<int>C; int 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> max_vec(vector<int> a, vector<int> b) { //取较大 更新答案 if (a.size() > b.size()) return a; //先比较位数 if (a.size() < b.size()) return b; //构造新的vector是a的逆序 当两个vector长度一样的时候,他们的大小关系就和她们的字典序大小关系一样 if (vector<int>(a.rbegin(), a.rend()) > vector<int>(b.rbegin(), b.rend())) return a; return b; } int main() { cin >> n; for (int i = 0; i <= n; i ++ ) { //第一个为国王,所以从0开始循环 int a, b; //a表示左手,b表示右手 cin >> a >> b; p[i] = {a * b, a}; //按乘积排序 } sort(p + 1, p + n + 1); //从小到大排序 vector<int> product(1, 1); //存乘积 初始为1 vector<int> res(1, 0); //答案 初始为0 for (int i = 0; i <= n; i ++ ) { //因为国王不会给自己发奖励,所以只有大于0的时候,才会更新答案 if (i) res = max_vec(res, div(product, p[i].first / p[i].second)); //前面所有数的乘积,除以当前的数字 product = mul(product, p[i].second); //存一下乘积 } for (int i = res.size() - 1; i >= 0; i -- ) cout << res[i]; //输出 倒叙 cout << endl; return 0; }