*## Protecting the Flowers 保护花朵 ##
- Description
约翰留下了 N 只奶牛呆在家里,自顾自地去干活了,这是非常失策的。他还在的时候,奶牛像 往常一样悠闲地在牧场里吃草。可是当他回来的时候,他看到了一幕惨剧:他的奶牛跑进了他的花园, 正在啃食他精心培育的花朵!约翰要立即采取行动,挨个把它们全部关回牛棚。 约翰牵走第 i 头奶牛需要 Ti 分钟,因为要算来回时间,所以他实际需要 2·Ti 分钟。第 i 头奶牛 如果还在花园里逍遥,每分钟会啃食 Di 朵鲜花。但只要约翰抓住了它,开始牵走它的那刻开始,就 没法吃花了。请帮助约翰写一个程序来决定押送奶牛的顺序,使得花朵损失的数量最小。
- Input Format
第一行:单个整数 N,1≤N≤100000
第二行到第 N+1 行:第 i+1 行有两个整数 Ti 和 Di,2≤Ti≤10^6 ; 1≤Di≤100
- Output Format
单个整数:表示约翰损失的最小花朵数量
- Sample Input
6
3 1
2 5
2 3
3 2
4 1
1 6
- Sample Output
86
- Hint
依次制服第六头,第二头,第三头,第四头,第一头和第五头。
- 分析
对于一个排序,其中两头牛a,b。记后面的D之和为
ΣD
如果a、b,花朵损失为
2∗Ta∗(ΣD+Db)+2∗Tb∗ΣD
;
如果b、a,花朵损失为
2∗Tb∗(ΣD+Da)+2∗Ta∗ΣD
。
两式可化简为
Ta∗Db
和
Tb∗Da
。
若后者小,交换两头牛就会得到更优的解,且不会影响前面及后面的结果。
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <ctime>
#include <cmath>
#include <map>
using namespace std;
long long ans,tim;
int n;
struct info{
int t,d;
}e[100001];
inline bool cmp(const info&a,const info&b){
return a.t*b.d<a.d*b.t;
}
int main(){
freopen("1196.in","r",stdin);
freopen("1196.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d%d",&e[i].t,&e[i].d);
}
sort(e+1,e+1+n,cmp);
for (int i=1;i<=n;i++){
ans+=tim*e[i].d;
tim+=e[i].t;
}
printf("%lld",ans*2);
fclose(stdin); fclose(stdout);
}