题目描述
有n头奶牛跑到FJ的花园里去吃花儿了,它们分别在距离牛圈T分钟处吃花儿,每分钟会吃掉D朵卡哇伊的花儿,(此处有点拗口,不要在意细节啊!),FJ现在要将它们给弄回牛圈,但是他每次只能弄一头回去,来回用时总共为2*T分钟,在这段时间内,其它的奶牛会继续吃FJ卡哇伊的花儿,速度保持不变,当然正在被赶回牛圈的奶牛就没口福了!现在要求以一种最棒的方法来尽可能的减少花儿的损失数量,求奶牛吃掉花儿的最少朵数!
(2 ≤ N ≤ 100,000) (1 ≤ Ti ≤ 2,000,000) (1 ≤ Di ≤ 100)
输入
第1行:单个整数N.
第2…N + 1行:每行包含两个空格分隔的整数,Ti和Di,描述单个牛的特征
输出
第1行:一个整数,它是被毁花的最小数量
样例输入
6
3 1
2 5
2 3
3 2
4 1
1 6
样例输出
86
#include<bits/stdc++.h>
#define N 1000100
using namespace std;
struct node
{
long long d;
long long t;
double s; //s=t/d
}a[N]; //可证明,先带走t/d较小的
int n;
int cmp(node x,node y)
{
if(x.s<y.s) return 1;
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&a[i].t,&a[i].d);
a[i].s=(double)a[i].t/a[i].d;
}
sort(a+1,a+n+1,cmp);
long long ans=0,t=a[1].t*2;
for(int i=2;i<=n;i++)
{
ans+=t*a[i].d;
t+=2*a[i].t;
}
cout<<ans<<endl;
return 0;
}