http://poj.org/problem?id=3045
题意:
N头牛叠罗汉,每头牛有个体重Wi,力气Si.一头牛要承担的风险为所有在它上面的牛的体重之和-它的力气。求一个方案使得风险最大的牛的风险值最小。
分析:
对于相邻的两头牛,它们交换位置不影响其他的任何牛,只改变这两头牛的风险值。记sum为这两头牛上面的牛的体重总和.i在j上面
Risk i=sum-si
Risk j=sum+wi-sj
交换位置之后
Risk i'=sum+wj-si
Risk j'=sum-sj
而方案1优于方案2,则max{Riski,Riskj} < max{Riski',Riskj'}
而Risk j >Risk j'
所以 Risk i' > max{Riski,Riskj}, 且Risk i' >Risk j'。
解之会得到:
wj + sj > wi + si 即w + s大的放在下面的方案是最优的。
AC_CODE:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int N,ans,sum[50010];
struct cow{
int u,v;
bool operator < (const cow &x) const{
return u+v < x.u + x.v;
}
}node[50010];
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d",&N) != EOF){
memset(sum, 0, sizeof(sum));
for(int i=1; i<=N; i++)
scanf("%d%d",&node[i].u,&node[i].v);
sort(node + 1, node + 1 + N);
int ans = -0x3f3f3f3f;
for(int i=1; i<=N; i++){
sum[i] = sum[i - 1] + node[i].u;
ans = max(ans, sum[i - 1] - node[i].v);
}
printf("%d\n",ans);
}
return 0;
}