Protecting the Flowers POJ 3262(贪心)
原题
题目分析
有点难度的贪心题,首先考虑在相同时间t内怎么能使损失最少,可以这样来控制相同时间,设想一个子问题,如果只有两头牛,那最后结束时间肯定是一样的,这时候怎么使损失最少,就直接比较t1*d2和t2*d1就行了,如果是第一个小就选牛1,否则选牛二.扩展来讲,就是对所有牛排序,对于牛i,j,按照ti*dj<tj*di的规则规定优先权,最后只需要按顺序搬牛就行了.
代码
1 #include <iostream> 2 #include <algorithm> 3 #include <utility> 4 #include <cstdio> 5 #include <cmath> 6 #include <cstring> 7 #include <string> 8 #include <vector> 9 #include <stack> 10 #include <queue> 11 #include <map> 12 #include <set> 13 14 using namespace std; 15 typedef long long LL; 16 const int INF_INT=0x3f3f3f3f; 17 const LL INF_LL=0x3f3f3f3f3f3f3f3f; 18 typedef pair<int,int> P; 19 20 P num[100000]; 21 22 bool cmp(P a,P b) 23 { 24 return a.first*b.second<b.first*a.second; 25 } 26 27 int main() 28 { 29 // freopen("black.in","r",stdin); 30 // freopen("black.out","w",stdout); 31 int n; 32 cin>>n; 33 long long sum=0; 34 for(int i=0;i<n;i++) scanf("%d %d",&num[i].first,&num[i].second),sum+=num[i].second; 35 sort(num,num+n,cmp); 36 long long ans=0; 37 for(int i=0;i<n;i++) 38 { 39 sum-=num[i].second; 40 ans+=sum*2*num[i].first; 41 } 42 cout<<ans<<endl; 43 return 0; 44 }