原题链接:https://www.acwing.com/problem/content/description/127/
题目分析
假设我们现在已经得到最优的排列,则选择第i头牛和第j头牛,交换他们两个必然会使结果(最大的不稳定度)变大。通过公式推导
可以知道要满足这一个条件要用s+w升序贪心策略。
注:当s+w结果相等,按照w升序
证明:假设s[i]+w[i]=s[i+1]+w[i+1], 记w[1]到w[i]之和=k,根据假设,w[i]<w[i+1];s[i]>s[i+1]
交换i和i+1:之前d1[i]=k-w[i],d1[i+1]=k+s[i]-w[i+1];之后d2[i]=k-w[i+1],d2[i+1]=k+s[i+1]-w[i]
d2[i+1]=d1[i+1]>d1[i],所以结论得证
c++代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 5e5 + 5;
PII cow[N];
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
{
int s, w;
scanf("%d%d", &w, &s);
cow[i] = {w + s, w};
//cow[i] = make_pair(w + s, w);
}
sort(cow, cow + n);//先比较w+s再w
int res = -2e9, sum = 0;
for (int i = 0; i < n; i ++ )
{
int s = cow[i].first - cow[i].second, w = cow[i].second;
res = max(res, sum - s);
sum += w;
}
printf("%d\n", res);
return 0;
}