题目链接
思路简单:先把单位时间破坏量最大的牛运走
小技巧:反向计算简化了复杂度
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
#include <map>
#include <stack>
#include <queue>
using namespace std;
typedef long long ll;
const int MAX=0x3f3f3f3f;
const int N=100010;
ll ans;
struct Cow{
int t,d;
}cow[N];
bool cmp(Cow a,Cow b){
return double(a.t)/a.d<double(b.t)/b.d; //a.d*a.t<b.d*b.t也可以,能减少运算时间
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&cow[i].t,&cow[i].d);
}
sort(cow,cow+n,cmp);
ll sumd=0,sumt=0;
for(int i=0;i<n;i++){
sumd+=cow[i].d*sumt;
sumt+=2*cow[i].t;
}
printf("%lld",sumd);
}