# BZOJ 1629: [Usaco2007 Demo]Cow Acrobats

## 1629: [Usaco2007 Demo]Cow Acrobats

Time Limit: 5 Sec   Memory Limit: 64 MB
Submit: 1009   Solved: 525
[ Submit][ Status][ Discuss]

## Description

Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planningto run away and join the circus. Their hoofed feet prevent themfrom tightrope walking and swinging from the trapeze (and theirlast attempt at firing a cow out of a cannon met with a dismalfailure). Thus, they have decided to practice performing acrobaticstunts.The cows aren't terribly creative and have only come up with oneacrobatic stunt: standing on top of each other to form a verticalstack of some height. The cows are trying to figure out the orderin which they should arrange themselves within this stack.Each of the N cows has an associated weight (1 <= W_i <= 10,000)and strength (1 <= S_i <= 1,000,000,000). The risk of a cowcollapsing is equal to the combined weight of all cows on top ofher (not including her own weight, of course) minus her strength(so that a stronger cow has a lower risk). Your task is to determinean ordering of the cows that minimizes the greatest risk of collapsefor any of the cows.//有三个头牛，下面三行二个数分别代表其体重及力量//它们玩叠罗汉的游戏，每个牛的危险值等于它上面的牛的体重总和减去它的力量值，因为它要扛起上面所有的牛嘛.//求所有方案中危险值最大的最小

## Input

* Line 1: A single line with the integer N.* Lines 2..N+1: Line i+1 describes cow i with two space-separated integers, W_i and S_i.

## Output

* Line 1: A single integer, giving the largest risk of all the cows in any optimal ordering that minimizes the risk.

3
10 3
2 5
3 3

## Sample Output

2

OUTPUT DETAILS:

Put the cow with weight 10 on the bottom. She will carry the other
two cows, so the risk of her collapsing is 2+3-3=2. The other cows
have lower risk of collapsing.

## Source

#include<cstdio>
#include<algorithm>
using namespace std;
struct node{int w,s;}a[50005];
int n,sum,ans;
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
bool cmp(node a,node b){return a.w+a.s<b.w+b.s;}
int main()
{
for(int i=1;i<=n;i++)
sort(a+1,a+n+1,cmp);
ans=-a[1].s;
for(int i=1;i<=n;i++)
sum+=a[i-1].w,ans=max(ans,sum-a[i].s);
printf("%d",ans);
return 0;
}