唐门绝技 暴雨梨花针 | 豆包MarsCode AI 刷题

166 阅读2分钟

问题描述

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

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

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

核心逻辑

  1. 输入解释

    • k:靶子数量。
    • p:结果取模的数值。
    • target:一个列表,每个元素是一个包含三个值的元组 (xleft,xright,y)(x {\text{left}}, x{\text{right}}, y)(xleft,xright,y),描述一个靶子线段。
  2. 代码逻辑

    • 首先根据靶子的左端点 x_{\text{left}}target 进行排序,确保靶子按照位置从左到右排列。

    • 初始化变量:

      • shootCount 表示射击次数。
      • shootStartshootEnd 分别表示当前正在考虑的射击范围的起始和结束位置。
    • 使用一个循环遍历所有靶子:

      • 如果当前靶子完全在射击范围内,则更新射击范围的起始和结束点。
      • 如果当前靶子与射击范围有部分重合,则扩展射击范围的起始点。
      • 如果当前靶子完全不在射击范围内,则增加一次射击,并将当前靶子作为新的射击范围。
    • 最后,加上最后一次射击,并对结果取模 ppp。

代码:

def solution(k, p, target):
    target = sorted(target, key=lambda x: x[0])
    shootCount = 0
    shootStart = target[0][0]
    shootEnd = target[0][1]
    i = 0
    while i < len(target):
        if target[i][0] >= shootStart and target[i][1] <= shootEnd:
            shootStart = target[i][0]
            shootEnd = target[i][1]
        elif target[i][0] <= shootEnd and target[i][1] >= shootEnd:
            shootStart = target[i][0]
        else:
            shootStart = target[i][0]
            shootEnd = target[i][1]
            shootCount += 1
​
        i+=1
    shootCount += 1
    return shootCount%p