26646: 建筑修建
greedy, http://cs101.openjudge.cn/practice/26646/
小雯打算对一个线性街区进行开发,街区的坐标为[0,m)。
现在有n个开发商要承接建筑的修建工作,第i个承包商打算修建宽度为y[i]的建筑,并保证街区包含了x[i]这个整数坐标。
建筑为一个左闭右开的区间,为了方便规划建筑的左侧必须为整数坐标,且左右边界不能超出街区范围。
例如,当m=7, x[i]=5, y[i]=3时,[3,6),[4,7)是仅有的两种合法建筑,[2,5),[5,8)则是不合法的建筑。
两个开发商修建的建筑不能有重叠。例如,[3,5)+[4,6)是不合法的,而[3,5)+[5,7)则是合法的。
小雯想要尽量满足更多开发商的修建工作,请问在合理安排的情况下,最多能满足多少个开发商的需求?
输入
第一行两个整数n,m(n, m ≤ 1000)
之后n行,每行两个整数表示开发商的计划,其中第i行的整数为x[i],y[i]。
输入保证x[i]从小到大排列,且都在[0,m)之间。并且保证y[i] > 0。
输出
一个整数,表示最多能满足多少个开发商的需求。
样例输入
3 5
0 1
3 2
3 2样例输出
2python
# 23n2300011072(X)
def generate_intervals(x, width, m):
temp = []
for start in range(max(0, x-width+1), min(m, x+1)):
end = start+width
if end <= m:
temp.append((start, end))
return temp
n, m = map(int, input().split())
plans = [tuple(map(int, input().split())) for _ in range(n)]
intervals = []
for x, width in plans:
intervals.extend(generate_intervals(x, width, m))
intervals.sort(key=lambda x: (x[1], x[0]))
cnt = 0
last_end = 0
for start, end in intervals:
if start >= last_end:
last_end = end
cnt += 1
print(cnt)