N N N 头奶牛中的每一头都有自己的重量 W i W_i Wi 以及强壮程度 S i S_i Si。
一头牛支撑不住的可能性取决于它头上所有牛的总重量(不包括它自己)减去它的身体强壮程度的值,现在称该数值为风险值,风险值越大,这只牛撑不住的可能性越高。
您的任务是确定奶牛的排序,使得所有奶牛的风险值中的最大值尽可能的小。
链接
我们先将奶牛按照顺序排列,如果有两头奶牛调换后结果可能更优,就调换他们。
现在有两头奶牛分别在从顶端数位置 i , j i,j i,j 上,满足 i < j i
所以……就什么也没看出来。
当 W − s [ i ] > W ′ − s [ j ] , W − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] W − s [ i ] > W − s [ j ] , s [ i ] < s [ j ] W > W ′ − w [ i ] + w [ j ] w [ j ] < 0 , 舍 当 W − s [ i ] > W ′ − s [ j ] , W − s [ j ] ≤ W ′ − w [ i ] + w [ j ] − s [ i ] W − s [ i ] > W ′ − w [ i ] + w [ j ] − s [ i ] , w [ j ] < 0 , 舍 当 W − s [ i ] ≤ W ′ − s [ j ] , W − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] − s [ j ] > − w [ i ] + w [ j ] − s [ i ] , w [ i ] + s [ i ] > w [ j ] + s [ j ] 当 W − s [ i ] ≤ W ′ − s [ j ] , W − s [ j ] ≤ W ′ − w [ i ] + w [ j ] − s [ i ] W ′ − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] , w [ i ] + s [ i ] > w [ j ] + s [ j ] 当W-s[i]>W'-s[j],W-s[j]>W'-w[i]+w[j]-s[i]\\ W-s[i]>W-s[j],s[i]W'-w[i]+w[j]\\ w[j]<0,舍\\ 当W-s[i]>W'-s[j],W-s[j]\le W'-w[i]+w[j]-s[i]\\ W-s[i]>W'-w[i]+w[j]-s[i],w[j]<0,舍\\ 当W-s[i]\le W'-s[j],W-s[j]>W'-w[i]+w[j]-s[i]\\ -s[j]>-w[i]+w[j]-s[i],w[i]+s[i]>w[j]+s[j]\\ 当W-s[i]\le W'-s[j],W-s[j]\le W'-w[i]+w[j]-s[i]\\ W'-s[j]>W'-w[i]+w[j]-s[i],w[i]+s[i]>w[j]+s[j]\\ 当W−s[i]>W′−s[j],W−s[j]>W′−w[i]+w[j]−s[i]W−s[i]>W−s[j],s[i]<s[j]W>W′−w[i]+w[j]w[j]<0,舍当W−s[i]>W′−s[j],W−s[j]≤W′−w[i]+w[j]−s[i]W−s[i]>W′−w[i]+w[j]−s[i],w[j]<0,舍当W−s[i]≤W′−s[j],W−s[j]>W′−w[i]+w[j]−s[i]−s[j]>−w[i]+w[j]−s[i],w[i]+s[i]>w[j]+s[j]当W−s[i]≤W′−s[j],W−s[j]≤W′−w[i]+w[j]−s[i]W′−s[j]>W′−w[i]+w[j]−s[i],w[i]+s[i]>w[j]+s[j]
那如果我只知道 i < j , w [ i ] + s [ i ] > w [ j ] + s [ j ] i
若 W − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] , W ′ > W , ∴ W ′ − s [ j ] > W − s [ j ] 若 W − s [ j ] ≤ W ′ − w [ i ] + w [ j ] − s [ i ] , − s [ j ] > − w [ i ] + w [ j ] − s [ i ] , W ′ − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] 若W-s[j]>W'-w[i]+w[j]-s[i],W'>W,\therefore W'-s[j]>W-s[j]\\ 若W-s[j]\le W'-w[i]+w[j]-s[i],-s[j]>-w[i]+w[j]-s[i],W'-s[j]>W'-w[i]+w[j]-s[i] 若W−s[j]>W′−w[i]+w[j]−s[i],W′>W,∴W′−s[j]>W−s[j]若W−s[j]≤W′−w[i]+w[j]−s[i],−s[j]>−w[i]+w[j]−s[i],W′−s[j]>W′−w[i]+w[j]−s[i]
所以我只需要按 w [ i ] + s [ i ] w[i]+s[i] w[i]+s[i] 排序即可
这真是十分的 Amazing 啊!
#include
#include
#include
#include
using namespace std;
struct node
{
int val,w;
friend bool operator < (node _,node __){
return _.val<__.val;}
}a[50005];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int w,s;
scanf("%d%d",&w,&s);
a[i].val=w+s;
a[i].w=w;
}
sort(a+1,a+n+1);
int ans=-1e9;
for(int i=1,sum=0;i<=n;i++)
{
int w=a[i].w,s=a[i].val-w;
ans=max(ans,sum-s);
sum+=w;
}
cout<<ans<<endl;
return 0;
}