http://poj.org/problem?id=3262
题意:n头牛在吃草,每秒吃di,你要驱赶这些牛,驱赶的时间2*ti,求怎么赶走全部牛,使总共吃最少的草(牛从你开始赶它就不在吃草
看了题解才会。。。。。
设已经x时刻
两头牛,判断是否要交换赶牛的顺序
di,ti
dj,tj
先第i头在第j头
吃的草:x*di+(x+2*ti)*dj
先第j头在第i头
吃的草:x*dj+(x+2*tj)*di
两式减一下,ti*dj - tj*di
所以按照这个比值排序就可以了。。。。想复杂了。。。
#include<algorithm>
#include<stdio.h>
#include<iostream>
#include<queue>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
long long sum;
struct node
{
long long t,d,index;
bool operator <(const node u)const
{
return t*u.d<u.t*d;
}
}num[100005];
int main()
{
int n;
long long ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%lld %lld",&num[i].t,&num[i].d);
}
sort(num,num+n);
long long now=0;
for(int i=0;i<n;i++)
{
ans+=now*num[i].d;
now+=num[i].t;
}
cout<<ans*2<<endl;
return 0;
}