1. 程式人生 > >1629: [Usaco2007 Demo]Cow Acrobats

1629: [Usaco2007 Demo]Cow Acrobats

solved sin mine std ons play sso output include

1629: [Usaco2007 Demo]Cow Acrobats

Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 1023 Solved: 531
[Submit][Status][Discuss]

Description

Farmer John‘s N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofed feet prevent them from tightrope walking and swinging from the trapeze (and their last attempt at firing a cow out of a cannon met with a dismal failure). Thus, they have decided to practice performing acrobatic stunts. The cows aren‘t terribly creative and have only come up with one acrobatic stunt: standing on top of each other to form a vertical stack of some height. The cows are trying to figure out the order in 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 cow collapsing is equal to the combined weight of all cows on top of her (not including her own weight, of course) minus her strength (so that a stronger cow has a lower risk). Your task is to determine an ordering of the cows that minimizes the greatest risk of collapse for 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

Silver

Analysis

貪心!

局部貪心。

現在前面有一個已經疊好的羅漢,而我們要在下面塞兩頭牛A B

為了讓A在B上,有sum + a.weight - b.strengh < sum + b.weight - a.strengh

也就是說,前面的決策不影響這裏,這裏的決策也不影響前面

只要將隊列按這個模式排好就行

Code

技術分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 struct node{
 7     long long str,wei;
 8 }arr[1000000];
 9 
10 bool cmp(const node &a,const node &b){
11     return (a.wei-b.str)<(b.wei-a.str);
12 }
13 
14 long long n,ret = -10000000000;
15 
16 int main(){
17     scanf("%lld",&n);
18     for(int i = 1;i <= n;i++){
19         scanf("%lld%lld",&arr[i].wei,&arr[i].str);
20     }
21     
22     sort(arr+1,arr+1+n,cmp);
23     
24     long long sum = 0;
25     for(int i = 1;i <= n;i++){
26 //        printf("%d/%d ",arr[i].wei,arr[i].str);
27         ret = max(ret,sum-arr[i].str);
28         sum += arr[i].wei;
29     }
30     
31     printf("%lld",ret);    
32     return 0;
33 } 
貪心 x2

1629: [Usaco2007 Demo]Cow Acrobats