1. 程式人生 > >POJ 3045-Cow Acrobats

POJ 3045-Cow Acrobats



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 ithin 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

Hint

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

題目大意:上面的牛的體重減去這頭牛的力量即為RISK,找出最優解的最大RISK。 思路:一開始想當然先w後s排序然後wa了。。。若相鄰兩頭牛屬性分別為w1,s1,w2,s2,第一頭牛在第二頭上面,sum為第一頭牛上面的牛的體重之和,那麼
第一頭牛風險:a=sum-s1;第二頭牛風險:b=sum+w1-s2;交換兩頭牛位置之後a'=sum+w2-s1,b'=sum-s2,如
果要最優放置則max(a,b)<max(a',b'),因為b>b'所以要滿足b<a'。即w1+s1<w2+s2。所以按照w+s排序。 程式碼: import java.util.*;

public class Main {  public static void main(String[] args) {
  Scanner scan = new Scanner(System.in);
  int t = scan.nextInt();
  notcow a[] = new notcow[50005];
  for (int i = 1; i <= t; i++) {
   int w = scan.nextInt();
   int s = scan.nextInt();
   a[i] = new notcow(w, s);
  }
  Arrays.sort(a, 1, t+1);
  long ans = Integer.MIN_VALUE;
  int sum[]=new int[50005];
  sum[0]=0;
  for(int i=1;i<=t;i++){
   sum[i]=sum[i-1]+a[i].w;
   if(sum[i-1]-a[i].s>ans){
    ans=sum[i-1]-a[i].s;
   }
  }
  System.out.println(ans);
 } } class notcow implements Comparable {
 int w, s;  notcow(int w, int s) {
  this.w = w;
  this.s = s;
 }  public int compareTo(Object o) {
  
  return (this.s+this.w) - (((notcow) o).s+((notcow)o).w);
 } }