如题http://poj.org/problem?id=3045
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3425 | Accepted: 1333 |
Description
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
* Lines 2..N+1: Line i+1 describes cow i with two space-separated integers, W_i and S_i.
Output
Sample Input
3 10 3 2 5 3 3
Sample Output
2
Hint
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
思路:题目要求确定一个序列使得这个序列最大风险在所有可能的序列中最小。对于任意的A,B牛,设他们上面的牛的总重量是m。
假设最优方案为A下B上。
R=m+WB-SA.
如果交换位置,有R‘=m+WA-SB.
有R<R' 则WB+SB<WA+SA.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 50005
#define inf 0x7fffffff
#define max(a,b)(a>b?a:b)
struct node
{
int w,s;
};
node a[MAXN];
bool operator<(node a,node b)
{
return a.w+a.s>b.w+b.s;
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
int N;
cin>>N;
int i;
int sum=0;
for(i=0;i<N;i++)
{
cin>>a[i].w>>a[i].s;
sum+=a[i].w;
}
sort(a,a+N);
int t=0;
int res=-inf;
for(i=0;i<N;i++)
{
res=max(res,sum-t-a[i].w-a[i].s);
t+=a[i].w;
}
cout<<res<<endl;
return 0;
}