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