USACO07JAN Protecting the Flowers

题目地址

题解

假设牛$i$和牛$j$相邻,那么比较他们谁先送走更划算的依据是$T_iD_j$和$T_jD_i$。
$T_iD_j>T_jD_i$那么$j$先走,否则$i$先走。
由此得判断依据:$\frac {T_i}{D_i}$与$\frac {T_j}{D_j}$。小的先走。
之后排序贪心即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std;
typedef long long ll;
ll n,t[100005],d[100005],ans=0,sum=0;
pair<double,ll> P[100005];
void init(){
scanf("%lld",&n);
for(ll i=0;i<n;i++)
scanf("%lld%lld",&t[i],&d[i]),
P[i].first=(double)t[i]/d[i],
P[i].second=i;
sort(P,P+n);
for(ll i=0;i<n;i++)
sum+=d[i];
}
void solve(){
for(ll i=0;i<n;i++){
ll id=P[i].second;
sum-=d[id];
ans+=2*t[id]*sum;
}
printf("%lld\n",ans);
}
int main(){
init();
solve();
return 0;
}