Skip to content

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

样例输出

2
python
# 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)