POJ3262贪心

题意:FJ去砍树,然后和平时一样留了 N (2 ≤ N ≤ 100,000)头牛吃草。当他回来的时候,他发现奶牛们正在津津有味地吃着FJ种的美丽的花!为了减少后续伤害,FJ决定立即采取行动:运输每头牛回到自己的牛棚。 每只奶牛i在离牛棚Ti(1 ≤ Ti ≤ 2,000,000) 分钟路程的地方,每分钟吃掉Di(1 ≤ Di ≤ 100)朵花。FJ只能一次带回一头奶牛。弄回一头奶牛i来回需要2*Ti分钟。从带回i号奶牛开始,i号奶牛就不会吃花。请你找出被毁坏的花的最小数量 。

题解:按照排序贪心的做法,通过a.D*b.T>b.D*a.T进行排序,找到每一个环节最小的破坏数,将其累加,便是最优解。

贪心证明:


#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
struct node{
    int D;
    int T;
}p[100005];
bool cmp(node a,node b)
{
    return a.D*b.T>b.D*a.T;
}
int main(void)
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
        cin>>p[i].T>>p[i].D;
    sort(p+1,p+1+n,cmp);
    ll ans=0,s_time=0;
    for(int i=1;i<=n;i++)
    {
        ans+=s_time*p[i].D;
        s_time+=(2*p[i].T);
    }
    cout<<ans<<endl;
}
原文地址:https://www.cnblogs.com/ZJNU-huyh/p/13224451.html