大致题意: 给定n 头牛,每头牛每分钟都会造成破坏图片说明 ,农夫可以将牛拉回牛栏里面花费的时间是图片说明 .请问农夫拉回牛的顺序是多少可以使得破坏最少。

分析:贪心。
考虑第i 头牛和第j 头牛,哪头先拉入牛栏.
如果图片说明图片说明 后,那么破坏为:图片说明.
如果图片说明图片说明 后,那么破坏为:图片说明 .
要使得破坏程度最少,即:
图片说明
化简: 图片说明
那么我们就按照上式子进行排序从小到大拉入牛进牛栏。然后依次算破坏程度即可。

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn=2e5+10;

pair<int,int> p[maxn];

bool cmp( pair<int,int> a,pair<int,int> b ){ return a.first*b.second<a.second*b.first; }

int main()
{
    int n;ll ans=0,sum=0,now=0;
    cin>>n;
    for( int i=1;i<=n;i++ ) cin>>p[i].first>>p[i].second,sum+=p[i].second;
    sort(p+1,p+1+n,cmp);
    for( int i=1;i<=n;i++ )
    {
        sum-=p[i].second;
        ans+=sum*2*p[i].first;
    }
    cout<<ans<<endl;
}