1629: [Usaco2007 Demo]Cow Acrobats
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 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.
Sample Input
3
10 3
2 5
3 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.
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.
HINT
Source
題解:一看數據範圍就是知道是貪心題,排個序就行了。於是磨磨蹭蹭地證了一下。假設我們必須把A放在B的上面。設A的重量和力量是w1,s1,B的是w2,s2。如果A在上面,B的危險值就是S+w1-a2.(其中S是之前的奶牛重量和)。如果A在下面,A的危險值就是S+w2-a1.因爲A在B上面更優,所以S+w1-a2<=s+w2-a1,整理後可得:w1+a1<=w2+a2。因此,我們要把總和小的放在前面。。。
代碼:
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{int w,s;}a[50005];
int n,sum,ans;
int read()
{
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()
{
n=read();
for(int i=1;i<=n;i++)
a[i].w=read(),a[i].s=read();
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;
}