赶吃花的牛
题目描述
农夫John出去砍伐,让N头牛在草地上吃草。当他回来时吃惊的看到这些牛全部都跑到花园里在吃他的美丽花朵。他立即去把每头牛赶回它的牛栏。 i号牛每分钟要吃掉D_i朵花,距离自己的栏地要T_i分钟路程。不幸的是John每次只能赶一头牛回栏,再回到花园。请问这些牛最少要吃掉多少朵花?
数据范围
2 <= N <= 100,000
1 <= T_i <= 2,000,000
1 <= D_i <= 100
输入格式
第一行一个数N。 下面N行,每行两个数T_i D_i,表示第i头牛的数据。
输出格式
一个整数,最少吃掉的花朵数。
样例数据
input
6
3 1
2 5
2 3
3 2
4 1
1 6
output
86
样例解释:最好方案赶回牛的次序为 6,2,3,4,1,5。
思路:首先定义一个结构体,分别储存该牛赶回牛栏的时间t和该牛吃花的速度v。我们先假设有两头牛A和B,如果先赶A,那么就要被吃掉2*A.t*B.v的花(因为农夫John要把牛赶回去,并且走回来,所以要乘2); 如果先赶B,那么就要被吃掉2*B.t*A.v的花,所以只要比较2*A.t*B.v2*B.t*A.v的大小就行了。也就是说我们先把每个数跟另外的所有数比较一便,然后暴力就行了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct kao//别问我为什么不是cow
{
long long t,v;
}a[100010];
bool mycmp(kao x,kao y)
{
return(y.t*x.v>x.t*y.v);
}
int main()
{
long long n,s=0,t=0,s1=0;
cin>>n;
for (int i=1;i<=n;i++)
cin>>a[i].t>>a[i].v;
sort(a+1,a+n+1,mycmp);
for (int i=2;i<=n;i++)
{
s1=s1+a[i-1].t*2;
s=s+s1*a[i].v;
}
cout<<s;
return 0;
}