MarsCode刷题--65.唐门绝技:暴雨梨花针最少发射次数

问题描述

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

Java代码

import java.util.Arrays;

public class Main {
    public static int solution(int k, int p, int[][] target) {
        // Please write your code here
        // 贪心算法
        Arrays.sort(target, (o1, o2) -> {
            if (o1[0] > o2[0]) {
                return 1;
            } else if (o1[0] < o2[0]) {
                return -1;
            } else {
                return o1[1] - o2[1];
            }
        });
        int l = target[0][0], r = target[0][1], result = 1;
        for (int i = 1; i < k; i++) {
            if (target[i][0] <= r) {
                l = Math.max(l, target[i][0]);
                r = Math.min(r, target[i][1]);
            } else {
                result++;
                l = target[i][0];
                r = target[i][1];
            }
        }
        return result % p;
    }

    public static void main(String[] args) {
        // You can add more test cases here
        int[][] testTarget1 = {
                { 10, 26, 3 },
                { 4, 8, 29 },
                { 1, 5, 8 },
                { 9, 9, 9 }
        };
        int[][] testTarget2 = {
                { 10, 26, 3 },
                { 4, 8, 29 },
                { 1, 5, 8 }
        };
        int[][] 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 }
        };

        System.out.println(solution(4, 100, testTarget1) == 3);
        System.out.println(solution(3, 100, testTarget2) == 2);
        System.out.println(solution(16, 100, testTarget3) == 5);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值