题意:(翻译一遍)农夫J想要去砍树,留下N头牛,让他们吃草,当他返回的时候,使他焦虑的是 他发现那群牛正在吃他漂亮的花,为了使他接下来的
损失达到最小,他立刻采取行动,把牛赶回牛圈里。每头牛在距离牛圈Ti位置,而且,当牛在等待的时候,他每单位时间吃Di朵花,农夫J一次只能
赶一头牛,需要2*Ti时间(来回),问按照那种赶牛顺序可以使损失最小。(在赶牛的过程中,被赶的那头牛不吃花,其他牛吃花)
#include<stdio.h>
#include<math.h>
typedef struct
{
int eat,distance;
}Cow;
Cow cow[100500];
void qsort(int l,int r)
{
int i,j;
Cow temp;
if(l<r)
{
i=l;
j=r;
temp=cow[l];
while(i<j)
{
while(i<j&&cow[j].eat*temp.distance<=temp.eat*cow[j].distance)
j--;
if(i<j)
cow[i++]=cow[j];
while(i<j&&cow[i].eat*temp.distance>temp.eat*cow[i].distance)
i++;
if(i<j)
cow[j--]=cow[i];
}
cow[i]=temp;
qsort(l,i-1);
qsort(i+1,r);
}
}
int main(void)
{
int i,N,j,sum=0;
long long tsum=0;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d%d",&cow[i].distance,&cow[i].eat);
sum+=cow[i].eat;
}
qsort(0,N-1);
tsum=0;
for(i=0;i<N;i++)
{
sum-=cow[i].eat;
tsum+=cow[i].distance*2*sum;
}
printf("%lld\n",tsum);
}