问题描述
在唐门,外门弟子唐三发现了一种强大的暗器技巧,名为暴雨梨花针,它能在一条直线上摧毁所有目标。唐三在一本古籍中学习到了这门技巧,为了练习,他设置了若干个靶子在二维平面上。每个靶子是一条垂直于X轴的线段,由三个参数 x_{left}
,x_{right}
,y
描述,其中 y
是固定的高度,x_{left}
和 x_{right}
表示线段在X轴上的起止位置。
唐三的目标是使用尽可能少的暴雨梨花针来击中所有靶子。由于暴雨梨花针的珍贵,每次射击必须经济有效。每次射击暴雨梨花针都将从某个 x
值发射,能垂直上升到 y = 100
。
请你帮助唐三计算最少需要多少次射击,才能保证击中所有靶子。结果需对给定的 P
取余。
测试样例
样例1:
输入:
k = 4, p = 100, target = [[10, 26, 3], [4, 8, 29], [1, 5, 8], [9, 9, 9]]
输出:3
样例2:
输入:
k = 3, p = 100, target = [[10, 26, 3], [4, 8, 29], [1, 5, 8]]
输出:2
样例3:
输入:
k = 5, p = 100, target = [[5, 15, 5], [1, 2, 3], [20, 25, 2], [6, 18, 2], [30, 40, 1]]
输出:4
样例4:
输入:
k = 2, p = 100, target = [[0, 10, 5], [15, 20, 3]]
输出:2
样例5:
输入:
k = 6, p = 100, target = [[3, 8, 10], [5, 10, 12], [1, 3, 14], [15, 18, 10], [20, 25, 10], [8, 12, 10]]
输出:4
解题思路:
问题理解
唐三需要使用尽可能少的暴雨梨花针来击中所有靶子。每个靶子是一条垂直于X轴的线段,由 x_left、x_right 和 y 描述。每次射击暴雨梨花针都将从某个 x 值发射,能垂直上升到 y = 100。
关键点
靶子的覆盖范围:每个靶子在X轴上有一个范围 [x_left, x_right],我们需要找到一种方法来覆盖所有这些范围。
射击点的选择:每次射击可以从任意 x 值发射,但需要确保能覆盖尽可能多的靶子。
解题思路
按高度分组:首先,我们可以按高度 y 对靶子进行分组。因为每次射击的高度是固定的 y = 100,所以我们只需要考虑同一高度的靶子。
按X轴范围排序:对于同一高度的靶子,我们可以按 x_left 或 x_right 进行排序,这样可以更容易找到覆盖范围。
贪心算法:我们可以使用贪心算法来选择每次射击的 x 值。具体步骤如下:
选择一个靶子,以其 x_right 作为射击点。
移除所有被该射击点覆盖的靶子。
重复上述步骤,直到所有靶子都被覆盖。
数据结构选择
列表:用于存储靶子的信息。
排序:按 x_left 或 x_right 对靶子进行排序。
算法步骤
对靶子按 y 进行分组。
对每个高度的靶子按 x_left 或 x_right 进行排序。
使用贪心算法选择射击点,覆盖尽可能多的靶子。
统计射击次数,并对结果取余。
代码示例:
def solution(k, p, target):
# Please write your code here
return -2
if __name__ == "__main__":
# You can add more test cases here
testTarget1 = [
[10, 26, 3],
[4, 8, 29],
[1, 5, 8],
[9, 9, 9]
]
testTarget2 = [
[10, 26, 3],
[4, 8, 29],
[1, 5, 8]
]
testTarget3 = [
[13, 20, 2],
[15, 39, 3],
[34, 89, 6],
[2, 10, 1],
[0, 87, 2],
[23, 49, 3],
[2, 45, 9],
[9, 98, 0],
[3, 12, 9],
[35, 45, 21],
[51, 67, 23],
[37, 42, 54],
[55, 76, 7],
[2, 13, 6],
[29, 31, 9],
[10, 32, 1]
]
print(solution(4, 100, testTarget1) == 3 )
print(solution(3, 100, testTarget2) == 2 )
print(solution(16, 100, testTarget3) == 5 )
输出:
【更多项目代码资源:ms3.ishenglu.com】.复制至浏览器