http://poj.org/problem?id=3045
贪心,按Wi+Si排列
对于最后一个位置,risk=W总-Wn-Sn,使得risk最小的是最大的(Wi+Si)。
View Code
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct data
{
int w,p;
long long all;
}node[50009];
int cmp(data a,data b)
{
return (a.p+a.w)>(b.p+b.w);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i;
for(i=1;i<=n;i++)
{
scanf("%d%d",&node[i].w,&node[i].p);
node[i].all=0;
}
sort(&node[1],&node[n+1],cmp);
long long sum=0;
for(i=n;i>=1;i--)
{
sum+=node[i].w;
node[i].all=sum;
}
long long max=-1000000000;
for(i=1;i<n;i++)
{
if(max<node[i+1].all-node[i].p)
max=node[i+1].all-node[i].p;
}
if(n==i)
{
if(max<-node[i].p)
max=-node[i].p;
}
printf("%lld\n",max);
}
return 0;
}