首页 > 试题广场 >

撞车

[编程题]撞车
  • 热度指数:2196 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
一条单向单车道的道路上有 n 辆车,第 i 辆车位于 x_i ,速度大小为 v_i

显然,如果车辆保持此速度行驶下去,在大多数情况下都会发生碰撞。

现在牛牛想知道,至少需要移除几辆车,才能让这些车不发生碰撞?

输入描述:
第一行一个整数  ,表示车的数量。

接下来 n 行,每行两个整数 ,表示车的位置和速度的大小。

数据保证 x_i 互不相同。


输出描述:
输出一行一个整数,表示需要移除车的数量。
示例1

输入

3
-1 -1
0 0
1 1

输出

0
示例2

输入

3
-1 1
0 0
1 -1

输出

2
# 按照位置进行排序
# 将每辆车的速度单独存储成一个数组
# 遍历速度数组元素
# 记录位置排序后的速度最长非递减子序列长度 L
# 满足按 x 升序排列后,速度序列是非递减的,就一定不会撞;否则会撞
# 如果当前速度大于记录窗口中的最大元素则直接添加
# 因为这辆车在之前出现的车后面,并且速度更快一定不会被之前已经出现过的车撞到
# 如果当前车速比tail末尾小,则在tail中找到第一大于v的位置,更新这个位置
# 得到最优最长非递减子序列
# 最后要移除的车的数量为总车数-最长非递减子序列的长度


import sys

def binary_search(arr, target):
    left, right = 0, len(arr)
    while left < right:
        mid = (left + right) // 2
        if arr[mid] > target:
            right = mid
        else:
            left = mid + 1
    return left

def main():
    data = sys.stdin.read().split()
    if not data:
        return
    
    n = int(data[0])
    cars = []
    index = 1
    for i in range(n):
        x = int(data[index])
        v = int(data[index + 1])
        index += 2
        cars.append([x, v])
    
    cars.sort()
    speeds = [car[1] for car in cars]
    
    tail = []
    for v in speeds:
        if not tail&nbs***bsp;v >= tail[-1]:
            tail.append(v)
        else:
            pos = binary_search(tail, v)
            tail[pos] = v
    
    print(n - len(tail))

if __name__ == "__main__":
    main()


发表于 2025-10-11 22:10:51 回复(0)