问题描述
在唐门,外门弟子唐三发现了一种强大的暗器技巧,名为暴雨梨花针,它能在一条直线上摧毁所有目标。唐三在一本古籍中学习到了这门技巧,为了练习,他设置了若干个靶子在二维平面上。每个靶子是一条垂直于X轴的线段,由三个参数 x_{left},x_{right},y 描述,其中 y 是固定的高度,x_{left} 和 x_{right} 表示线段在X轴上的起止位置。
唐三的目标是使用尽可能少的暴雨梨花针来击中所有靶子。由于暴雨梨花针的珍贵,每次射击必须经济有效。每次射击暴雨梨花针都将从某个 x 值发射,能垂直上升到 y = 100。
请你帮助唐三计算最少需要多少次射击,才能保证击中所有靶子。结果需对给定的 P 取余
核心逻辑
-
输入解释
:
k:靶子数量。p:结果取模的数值。target:一个列表,每个元素是一个包含三个值的元组 (xleft,xright,y)(x {\text{left}}, x{\text{right}}, y)(xleft,xright,y),描述一个靶子线段。
-
代码逻辑
:
-
首先根据靶子的左端点
x_{\text{left}}对target进行排序,确保靶子按照位置从左到右排列。 -
初始化变量:
shootCount表示射击次数。shootStart和shootEnd分别表示当前正在考虑的射击范围的起始和结束位置。
-
使用一个循环遍历所有靶子:
- 如果当前靶子完全在射击范围内,则更新射击范围的起始和结束点。
- 如果当前靶子与射击范围有部分重合,则扩展射击范围的起始点。
- 如果当前靶子完全不在射击范围内,则增加一次射击,并将当前靶子作为新的射击范围。
-
最后,加上最后一次射击,并对结果取模 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