思路

也是一个推公式的题目

但是发现好像直接推, 有地方化简不了?

alt

这里要用到数学归纳法

先尝试规模为1的子问题 alt

发现好像已经得到递推式了

然后规模为k的问题是最优解, 那么k + 1 也是最优解

对了,要有一个前缀和, 因为是累加

ac代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int inf = INT_MAX;
typedef pair<int, int> pii;
typedef priority_queue<int, vector<int>, greater<int>> small_heap;
#define int long long
#define dd first
#define tt second
bool cmp(const pii &a, const pii &b)
{
    return 1.0 * a.tt / a.dd < 1.0 * b.tt / b.dd;
}
int32_t main()
{
    int n;
    cin >> n;
    vector<pii> a(n + 1);
    vector <int>  sd(n + 1);
    for (int i = 1; i <= n; i++)
    {
        int t, d;
        cin >> t >> d;
        a[i] = {t, d};
    }
    sort(a.begin() + 1, a.end(), cmp);
    int sum = 0;
    sd[0] = 0;
    for (int i = 1; i <= n; i++)
    {
        sd[i] = sd[i - 1] + a[i].dd;
    }
    for (int i = 1; i <= n; i++)
    {
        sum +=(sd[n] - sd[i]) * a[i].tt * 2;
    }
    cout << sum;
    return 0;
}