【USACO】2007 Jan Protecting the Flowers 保护花朵

*## 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,花朵损失为 2Ta(ΣD+Db)+2TbΣD ;
如果b、a,花朵损失为 2Tb(ΣD+Da)+2TaΣD
两式可化简为 TaDb TbDa
若后者小,交换两头牛就会得到更优的解,且不会影响前面及后面的结果。


#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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值