POJ 3262 【貪心】
阿新 • • 發佈:2017-08-07
%d none rtc class table tables style spl tdi
題意:
有n個牛在FJ的花園亂吃。
所以FJ要趕他們回牛棚。
每個牛在被趕走之前每秒吃Di個花朵。趕它回去FJ來回要花的總時間是Ti×2。在被趕走的過程中,被趕走的牛就不能亂吃
思路:
先趕走破壞力大的牛
假設序列都由二元組組成,二元組是由T和D組成,那麽對一個序列有相鄰的兩頭牛是這樣的
..........(a, b) ,(c, d)....................
如果(a,b)和(c,d)交換位置了
變成新序列
..........(c,d),(a,b).......................
假設在這之前FJ已經花了x時間了。
那麽趕完這兩頭牛的損失的量就分別為
x*b + (x + a ) * d
x*d +(x + c) * b
二者做差
得到ad - bc
若ad < bc 則有第一個序列優於第二個。
//bool cmp(cow x, cow y) //{ // return x.t * y.d < x.d * y.t; //} #include <iostream> #include <cstdio> #include <queue> #include <math.h> #include <cstring> #include <algorithm> using namespace std; struct cow { double t,d; }a[2000001]; bool cmp(cow x,cow y) { return x.d/x.t > y.d/y.t; } int main() { int n; scanf("%d", &n); for(int i=0;i<n;i++) scanf("%lf%lf",&a[i].t,&a[i].d); sort(a,a+n,cmp); long long sum=0,s=0; for(int i=0;i<n;i++) { sum+=2*s*a[i].d; s+=a[i].t; } cout<<sum<<endl; return 0; }
POJ 3262 【貪心】