【题意】
有N只奶牛,要摞在一起。
每只奶牛有重量wi和体力值si
每只奶牛的压扁值为它上面的奶牛的重量w之和-它自己的体力值si
使最大的压扁值最小。
【题解】
贪心,构造排序的compare函数即可。
假设有两只相邻的奶牛i和j,
i在j上的总压扁值是 max( a+Wi-Sj, a-Si), 其中a是他们上面的奶牛的质量。
j在i上的总压扁值是 max( a+Wj-Si, a-Sj).
比较这两个值的大小来决定i, j的上下关系即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define N 500010
using namespace std;
int n;
LL ans=-2e9,sum;
struct rec{
int w,s;
}a[N];
inline int read(){
int k=0,f=1; char c=getchar();
while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
return k*f;
}
inline bool cmp(rec x,rec y){
int xabove=max(x.w-y.s,-x.s);
int yabove=max(y.w-x.s,-y.s);
return xabove<yabove;
}
int main(){
n=read();
for(int i=0;i<n;i++) a[i].w=read(), a[i].s=read();
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
ans=max(ans, sum-a[i].s);
sum+=a[i].w;
}
printf("%lld
",ans);
return 0;
}