这道题的关键在于如何对这些牛进行排序。
设有两头牛分别为a, b。
a = (Ta, Da),b = (Tb, Db)
则先传送a回牛棚损失2Ta * Db;
先传送b损失2Tb * Da;
因此排序时选择损失较小的,即每次选取最优解。
#include <cstdio>
#include <algorithm>
using namespace std;
typedef pair<int, int> P;
const int MAXN = 10e5;
P cows[MAXN+5];
int comp(P a, P b)
{
return a.first * b.second < b.first * a.second;
}
int main()
{
int n;
scanf("%d", &n);
long long sum = 0;
for (int i = 0; i < n; i++) {
scanf("%d%d", &cows[i].first, &cows[i].second);
sum += cows[i].second;
}
sort(cows, cows+n, comp);
long long ans = 0;
for (int i = 0; i < n - 1; i++) {
sum -= cows[i].second;
ans += 2 * cows[i].first * sum;
}
printf("%lld\n", ans);
return 0;
}