唐门绝技:暴雨梨花针最少发射次数| 豆包MarsCode AI 刷题

173 阅读2分钟

这里简单讲解一下唐门绝技:暴雨梨花针最少发射次数这道题。

题目大意:

在唐门,外门弟子唐三发现了一种强大的暗器技巧,名为暴雨梨花针,它能在一条直线上摧毁所有目标。唐三在一本古籍中学习到了这门技巧,为了练习,他设置了若干个靶子在二维平面上。每个靶子是一条垂直于X轴的线段,由三个参数 x_{left}x_{right}y 描述,其中 y 是固定的高度,x_{left} 和 x_{right} 表示线段在X轴上的起止位置。

唐三的目标是使用尽可能少的暴雨梨花针来击中所有靶子。由于暴雨梨花针的珍贵,每次射击必须经济有效。每次射击暴雨梨花针都将从某个 x 值发射,能垂直上升到 y = 100

请你帮助唐三计算最少需要多少次射击,才能保证击中所有靶子。结果需对给定的 P 取余。

测试样例:

样例有点长,就不写了直接解释

样例1解释:

攻击4或5可以击中第二三个靶子,剩下两个靶子需要两次发射才可以全部击中

样例2解释:

攻击4或5可以击中第二三个靶子,剩下的一个靶子需要一次攻击

求解思路

我猜出题人一定是斗罗大陆看多了

这道题需要我们找到最小的攻击次数,即每次攻击尽可能多的击中靶子。可以使用贪心的思想,将所有靶子按照左端点排序(右端点也可以),然后观察每个靶子的右端点,是否与前一个靶子的左端点相交,如果相交就更新公共区域,如果不相交则说明已经找到了一次攻击所能击中的最多的靶子数量,攻击数+1、初始化相交区域即可。循环直到遍历完所有靶子,最后攻击数即为答案。

公共区域的左右端点初始为第一个靶子的左右端点,若公共区域与下一个靶子相交,更新公共区域左端点为下一个靶子的左端点,公共区域右端点为min(公共区域右端点,下一个靶子右端点)。

题中给出的高度信息在解题时没有用处,忽略即可。

注意最后对结果取余!!!

下面是AC代码

def solution(k, p, target):
    target.sort(key=lambda t: t[0])
    
    shots = 0
    current_right = float('-inf')
    
    for target in target:
        x_left, x_right, _ = target
        if x_left > current_right:
            shots += 1
            current_right = x_right
        else:
            current_right = min(current_right, x_right)
    
    return shots % p