Time Limit: 1000MS |
|
Memory Limit: 65536K |
Total Submissions: 3639 |
|
Accepted: 1412 |
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.
题意:n头牛叠起来(一头牛站在另一头牛的上面,成“1”字形),每头牛都有自己的重量wi和力量si,每头牛都有风险值为自己上面的牛的总重减去自己的力量,问这n头牛叠起来面临的危险值最小是多少?
题解:对于这题有两种思路。
1:对于每头牛而言,视他与他上面的牛为一个整体,总重为sum_w,那么对于这头牛的危险值为sum_w-w-s,要想sum_w-(w+s)的值最小,w+s的值就应该最大,由此可见取最优化,wi+si越大越应该在下面。
2:假设目前排放的的序列是最优排列。任意位置有第一头牛和第二头牛分别有w1,s1;w2,s2。第一头牛上面的牛的重量总和为sum。且第一头牛在第二头牛上面,可以知道危险指数分别为a=sum-s1,b=sum+w1-s2。现在调换两头牛的位置,可得a'=sum+w2-s1,b'=sum-s2。 因为之前是最优排列,所以得知w2-s1>=w1-s2, 移项可得:
w2+s2>=w1+s1,所以体重和力量之和越大越在底下。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f
using namespace std;
struct node
{
int w,s;
}a[50010];
int cmp(node a,node b)
{
return a.w+a.s>b.w+b.s;
}
int main()
{
int n,i,j;
long long sum;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=0;i<n;++i)
{
scanf("%d%d",&a[i].w,&a[i].s);
sum+=a[i].w;
}
sort(a,a+n,cmp);
long long ans=-INF;
for(i=0;i<n;++i)
{
sum-=a[i].w;
ans=max(ans,sum-a[i].s);
}
printf("%lld\n",ans);
}
return 0;
}