CH0701 --国王游戏(高精(python) + 贪心)

很经典的问题,使用微扰技巧可以证明将大臣左手的金钱与大臣右手的金钱的乘积从小到大排序时,大臣所获得的最大金钱值最小。但是n为1000,n个数相乘会爆long long,所以需要高精度,不想写高精度所以用python实现了,时间复杂度主要来自高精度乘法,最大可以有4 * n位数,时间复杂度为O(n^2)。

在python中,关键字排序可以使用lambda函数实现,c++中的pair可以使用元组代替,pair是特殊的元组,即二元组。具体代码如下:

n = int(input())
a = input().split(' ')
f = int(a[0])
b = []
for i in range(0, n) :
    x = input().split(' ')
    u = int(x[0])
    v = int(x[1])
    w = u * v
    t = (w, u, v)
    b.append(t)
b.sort(key=lambda s:(s[0]))
maxs = 0
for i in range(0, n):
    if maxs < f // b[i][2]:
        maxs = f // b[i][2]
    f *= b[i][1]
print(maxs)

附上一个没写高精的半成品c++代码, 能拿60分

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
#define x first
#define y second
using pii = pair<int, int>;
using piii = pair<int, pii>;
piii p[N];
int main(){
    int n, a, b;
    cin >> n;
    cin >> a >> b;
    for(int i = 0;i < n; i++){
        cin >> p[i].y.x >> p[i].y.y;
        p[i].x = p[i].y.x * p[i].y.y;
    }
    sort(p, p + n);
    int maxs = 0, last = a;
    for(int i = 0;i < n; i++){
        pii pp = p[i].y;
        maxs = max(last / pp.y, maxs);
        last *= pp.x;
    }
    cout << maxs << endl;
    return 0;
}

 

posted @ 2021-03-16 22:45  liuzhexuan  阅读(188)  评论(0)    收藏  举报