题目描述:约翰的奶牛每分钟吃掉D_i朵花,把它赶走需要T_i分钟(来回加倍)。问最小损失花朵数量。
题解:贪心策略是先尽量赶走吃得多并且走得慢的牛,如何衡量“多”“慢”?按照单位时间的损害,较大的既是——吃得多并且走得慢的牛。
参考程序:
#include<cstdio>
#include<algorithm>
#include<iostream>
#define maxn 100000
using namespace std;
struct Cow{
int T,D;
};
Cow cow[maxn];
bool cmp(Cow a,Cow b){
return a.T*b.D<b.T*a.D;
}
int main(){
int N,tot=0;
scanf("%d",&N);
for (int i=0;i<N;i++)
scanf("%d %d",&cow[i].T,&cow[i].D),tot+=cow[i].D;
sort(cow,cow+N,cmp);
long long res=0;
for (int i=0;i<N;i++){
tot-=cow[i].D;
res+=tot*2*cow[i].T;
}
cout<<res;
return 0;
}