题意:有N层地板, 每层都有一个自己的重量 wi 和强度 si, 每层都有一个潜在的伤害值, 第i层的伤害值等于(Σwj )-si,(0<j<i)。问:使的每层的伤害值中的最大值最小。
解题思路:
对于相邻放置的两块板,设两块板为i,j他们上面的重量为sum
1) a=sum-si;b=sum+wi-sj;
交换两个板的位置
2)a'=sum+wj-si;b'=sum-sj;
如果1优于2,求解得有效的条件为wj-si>wi-sj
即wj+sj>wi+si
所以按si+wi的和排序贪心即可。
程序:
#include <math.h>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define LL long long
using namespace std;
struct node{
LL a,b;
}p[100010];
int cmp(node u,node v){
return u.a+u.b<v.a+v.b;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++)
scanf("%I64d%I64d",&p[i].a,&p[i].b);
sort(p,p+n,cmp);
LL res=0,_max=0;
for(int i=0;i<n;i++){
_max=max(_max,res-p[i].b);
res+=p[i].a;
}
printf("%I64d\n",_max);
}
}