1. 程式人生 > >POJ 3262 【貪心】

POJ 3262 【貪心】

%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 【貪心】