这是一道贪心的比较经典的题
我们要知道对于牵牛回去的顺序来说 其中相邻的 a b 两者交换对于他们前面和后面是没有影响的
于是就有了
牵a回去的代价是: a.t * b.d * 2
牵b回去的代价是: b.t * a.d * 2
两者一比较化简 cmp函数里就写 a.tb.d<b.ta.d 注意答案范围超过了int
#include <bits/stdc++.h> #define ll long long const int N=1e5+5; using namespace std; ll n,sumd,ans; struct T { ll t,d; }a[N]; bool cmp(T a,T b) { return a.t*b.d<b.t*a.d; } int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;++i) { cin>>a[i].t>>a[i].d;sumd+=a[i].d; } sort(a+1,a+1+n,cmp); for(int i=1;i<=n;++i) { sumd-=a[i].d; ans+=sumd*a[i].t*2; } cout<<ans<<endl; return 0; }