我们要考虑的问题就是当有两头牛t1 d1和t2 d2我们应该先把谁先运走
假如先运1
最后的损失就是 2 * t1 * d2
假如先运2
最后的损失就是 2 * t2 * d1
假如先运1更好
也就是2 * t1 * d2 < 2 * t2 * d1
即 (t1 / d1) < (t2 / d2)
也就是我们优先运t / d小的牛
所以先按照t / d从小到大排序一次,从前往后计算即可
因为反复使用di + di+1 +......dn
所以我们用sum[i]表示上述式子,预处理出sum数组
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define MAX_N 100005
using namespace std;
typedef long long int ll;
struct data
{
ll t, d;
bool operator < (const data& b) const
{
return (t * 1.0 / d) < (b.t * 1.0 / b.d);
}
};
int main()
{
//freopen("in.txt", "r", stdin);
int N;
data dat[MAX_N];
int sum[MAX_N];
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%I64d%I64d", &dat[i].t, &dat[i].d);
sort(dat, dat + N);
sum[N - 1] = dat[N - 1].d;
for (int i = N - 2; i >= 0; i--)
sum[i] = sum[i + 1] + dat[i].d;
ll ans = 0;
for (int i = 0; i < N - 1; i++)
ans += dat[i].t * 2 * sum[i + 1];
printf("%I64d\n", ans);
return 0;
}