#P2974. USACO(28)贪心进阶2:奶牛杂技[Cow Acrobats, 2005 Nov]
USACO(28)贪心进阶2:奶牛杂技[Cow Acrobats, 2005 Nov]
Description
【题意】有 N 头奶牛出场,第一头牛站在地上,剩下的奶牛挨个爬上到前一头的背上,直到最后一头奶牛爬到最高的地方为止。每头被压在下面的奶牛都会受到来自上方的压力。
设第 i 头奶牛的重量为 Wi,力量为 Si。每头奶牛的压力指数定义为它所承受重量之和与它自己的力量之差。
请告诉奶牛们,它们该怎么安排叠罗汉的顺序,才能使得团队中最大的压力指数最小。
【输入格式】
• 第一行:单个整数 N($1 \le N \le 50000$)
• 第二行到第 N + 1 行:第 i + 1 行有两个整数 Wi 和 Si($1 \le Wi \le 10^4 , 1 \le Si \le 10^9$)
【输出格式】
• 单个整数:表示最大压力指数的最小值。
【样例输入】
3
10 3
2 5
3 3
【样例输出】
2
【解释】
让重量为 10 的奶牛垫底,它的压力指数为2 + 3 − 3 = 2,其余两头牛的压力指数都比它小。
Hint
by hansang:#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long LL;
struct node{LL w, s;} a[N];
bool cmp(node n1, node n2){
return (n1.w-n2.s)<(n2.w-n1.s);
}
int main(){
int n; scanf("%d", &n);
for(int i=1; i<=n; i++){
scanf("%lld%lld", &a[i].w, &a[i].s);
}
sort(a+1, a+n+1, cmp);
LL sum=0, ans=-1e9;
for(int i=1; i<=n; i++){
ans=max(ans, sum-a[i].s);
sum+=a[i].w;
}
printf("%lld\n", ans);
return 0;
}