成仙之路−> 算法基础课题解
结论: 按 wi + si 从小到大排序
证明:
假设 wi+si>wi+1+si+1
第 i 个位置的牛 第 i+1 个位置的牛
交换前:w1+w2+…+wi−1−si w1+w2+…+wi−si+1
交换后:w1+w2+…+wi−1−si+1 w1+w2+…+wi−1+wi+1−si
在两边同时加上 −(w1+w2+…+wi−1)+si+si+1,则:
第 i 个位置的牛 第 i+1 个位置的牛
交换前: si+1 wi+si
交换后: si wi+1+si+1
易得 wi+si=max
因此,对于位置越小的\ 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;
}