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