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 } 

 

posted @ 2019-08-24 15:19  VBL  阅读(144)  评论(0编辑  收藏  举报