$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
结论: 按 $w_i$ + $s_i$ 从小到大排序
证明:
$假设\ w_i+s_i>w_{i+1}+s_{i+1}$
$\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 第\ i\ 个位置的牛\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 第\ i+1\ 个位置的牛$
$交换前:w_1+w_2+…+w_{i-1}-s_i\ \ \ \ \ \ \ \ \ \ \ \ \ \ w_1+w_2+…+w_{i}-s_{i+1}$
$交换后:w_1+w_2+…+w_{i-1}-s_{i+1}\ \ \ \ w_1+w_2+…+w_{i-1}+w_{i+1}-s_i$
$在两边同时加上\ -(w_1+w_2+…+w_{i-1})+s_i+s_{i+1},则:$
$\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 第\ i\ 个位置的牛\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 第\ i+1\ 个位置的牛$
$交换前:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ s_{i+1}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ w_i+s_i$
$交换后:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ s_i\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ w_{i+1}+s_{i+1}$
$易得\ w_i+s_i=\max \{ s_{i+1},w_i+s_i,s_i,w_{i+1}+s_{i+1}\}$
$因此,对于位置越小的\ i,w_i+s_i\ 越小越好$
完整代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 50010;
int n;
PII cow[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int w,s;
cin>>w>>s;
cow[i]={w+s,s};
}
sort(cow,cow+n); //按 w + s 从小到大排序
int res=-2e9,sum=0;
for(int i=0;i<n;i++)
{
int w=cow[i].first-cow[i].second,s=cow[i].second;
res=max(res,sum-s); //上面的牛牛们的总体重 - 当前牛的强壮程度
sum+=w; //下一头牛上面的牛牛们的总体重
}
cout<<res<<endl;
return 0;
}