Description
现在有N块积木,每块积木都有自重W和正常状态下的承重能力F,
现在要把这N块积木垒在一起,但是有可能某块积木的负重超过了它在正常状态下的承重能力,
那么这块积木就有被压坏的危险,
请问应该如何堆这N块积木使得N块积木中最大的压力指数最小。
这里定义压力指数为该积木的负重与其在正常状态下的承重能力的差值。
1≤N≤50000,1≤W≤10000,1≤F≤10^9。
Format
Input
第一行为一个正整数N,表示有N块积木。
第二行到第 N+1 行,每行两个整数数,分别是第i个积木的W[i]和F[i]。
Output
输出共一行,表示最大压力指数的最小值。
Samples
输入数据 1
3
10 3
2 5
3 3
Copy
输出数据 1
2
Copy
Hint 从顶到底按下列方式来放
(3,3)
(2,5)
(10,3)
于是对于(3,3)来说,它受到的压力为它上方的木块重量减去它自己的承重能力,0-3=-3
于是对于(2,5)来说,它受到的压力为它上方的木块重量减去它自己的承重能力,3-5=-2
于是对于(10,3)来说,它受到的压力为它上方的木块重量减去它自己的承重能力,5-3=2
明显其中的最大值为2
显然这是一个大难(水)题
CODE:
#include <bits/stdc++.h>
using namespace std;
struct node {
int x, y;
} a[1000007];
bool cmp(node a, node s) {
return s.x + s.y > a.x + a.y;
}
int main() {
//freopen("water1.in", "r", stdin);
//freopen("water1.ans", "w", stdout);
int n;
int ans = 0, sum = -1000007;
cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i].x >> a[i].y;
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++) {
sum = max(sum, ans - a[i].y);
ans += a[i].x;
}
printf("%d\n", sum);
return 0;
}