大致题意: 给定 头牛,每头牛每分钟都会造成破坏
,农夫可以将牛拉回牛栏里面花费的时间是
.请问农夫拉回牛的顺序是多少可以使得破坏最少。
分析:贪心。
考虑第 头牛和第
头牛,哪头先拉入牛栏.
如果 先
后,那么破坏为:
.
如果 先
后,那么破坏为:
.
要使得破坏程度最少,即:
化简:
那么我们就按照上式子进行排序从小到大拉入牛进牛栏。然后依次算破坏程度即可。
#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;
} 
京公网安备 11010502036488号