堆积木

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值