题意: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; }