题目:
农夫有n头牛跑到花坪上吃草,农夫要把它们送回自己的牛舍,所化的时间分别为 t_i,(单程时间为t_i),每头牛留在华坪上每单位时间内吃花量分别为d_i。华坪上花最少被破坏的数量为多少?
Sample Input
6 3 1 2 5 2 3 3 2 4 1 1 6
Sample Output
86
题解:
很久没做贪心的题,开始就瞎做了。。。以T小或者D的排序都不对。。然后重新整理了一下思路。
首先,这道题为什么可以用贪心不用动态规划呢?
因为这题假设第一只牛被移开后,剩下的牛又是同样的情况,所以是同样的问题,规模在缩小。
先拿两只牛来证明:A和B
先移开A,被毁坏的花的数量为2*A.T*B.D;
先移开B,被毁坏的花的数量为2*B.T*A.D;
所以返回 A.T*B.D<B.T*A.D的。
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int T,D;
};
node a[100005];
bool cmp(node x,node y)
{
return x.T*y.D<y.T*x.D;
}
int main()
{
int N;
cin>>N;
long long sum=0,sumdes=0;
for(int i =0;i<N;i++)
{
cin>>a[i].T>>a[i].D;
sumdes+=a[i].D;
}
sort(a,a+N,cmp);
for(int i=0;i<N;i++)
{
sumdes-=a[i].D;
// cout<<a[i].T*2*sumdes<<endl;
sum+=a[i].T*2*sumdes;
}
cout<<sum;
return 0;
}