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.

Sample Input

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.

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;
}


發佈了49 篇原創文章 · 獲贊 11 · 訪問量 7392
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章