思路:
题目让最小化最大值,是用了贪心的思想
假设有两种叠罗汉方法,对于任意相邻的两个位置,交换上下顺序,不影响其他牛的risk值
那么A上B下:(A对应第i个牛,B对应第i+1个牛)
对于A:W-s[i] ---1
对于B:W+w[i]-s[i+1] ---2
A和B交换位置
对于A:W+w[i+1]-s[i] ---3
对于B:W-s[i+1] ---4
可见:①<③;②>④
假设A上B下得到的值小,则②<③
即w[i]+s[i]<w[i+1]+s[i+1]
就是排序就行了。。。
代码如下:
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#define ll long long
using namespace std;
const int N=50005;
const int INF=0x3f3f3f3f;
struct A{
int w,s;
}a[N];
bool cmp(A a,A b){
return a.s+a.w<b.s+b.w;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].w,&a[i].s);
}
sort(a,a+n,cmp);
int sum=0,ans=-INF;
for(int i=0;i<n;i++){
int k=sum-a[i].s;
sum+=a[i].w;
if(k>ans){
ans=k;
}
}
printf("%d\n",ans);
}