程序员趣味题目:唐门绝技暴雨梨花针

问题描述

在唐门,外门弟子唐三发现了一种强大的暗器技巧,名为暴雨梨花针,它能在一条直线上摧毁所有目标。唐三在一本古籍中学习到了这门技巧,为了练习,他设置了若干个靶子在二维平面上。每个靶子是一条垂直于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】.复制至浏览器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值