洛谷P1080 国王游戏

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;
}

 

posted @ 2019-10-30 17:19  晴屿  阅读(184)  评论(0)    收藏  举报