题意:
一坨牛往上叠,每头牛有两个属性:w和s,分别代表自身重量和力量。一头牛的风险定义为:他头上的牛总重-他的力量。
确定一坨牛的排列顺序,使得这些牛的最大风险最低。
题解:
最小化最大值?二分走起?这道题没必要!常识也知道,重的,力量大的应该在下面。
不妨证明下:
A牛 :A牛头上有sum重量
B牛
假定现在为最优状态,对下面的牛:risk1=sum+w_a-s_b;
互换一下:
risk2=sum+w_b-s_a;
则risk1<risk2;即w_b+s_b>w_a+s_a;
所以原先在下面的牛还是老实地待着吧。依次类推,上面每个牛都应该满足此条件,才能保证全体最优!
所以这道题就是赤裸裸的贪心,把牛按照w+s排序。然后从最上层的牛开始扫描每个的牛risk即可。扫描出最大的risk。就是题目答案。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
struct node{int w,s,ss;};
struct node a[50005];
int sum[50005];
bool cmp(struct node x,struct node y)
{
return x.ss<y.ss;
}
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
//cin>>a[i].w>>a[i].s;再用cin可以剁手了
scanf("%d%d",&a[i].w,&a[i].s);
a[i].ss=a[i].w+a[i].s;
}
sort(a+1,a+n+1,cmp);
int ans=-0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+a[i].w;
ans=max(ans,sum[i-1]-a[i].s);
}
cout<<ans<<endl;
}