解题思路:

注意事项:

参考代码:import math

import heapq

import sys


def min_sprinklers(n, L, W, sprinklers):

    intervals = []

    W_half = W / 2

    for pos, r in sprinklers:

        if r < W_half:

            continue  # 喷头无法覆盖整个宽度

        dx = math.sqrt(r**2 - W_half**2)

        start = max(0, pos - dx)

        end = min(L, pos + dx)

        intervals.append((start, end))

    

    # 按照起始位置排序

    intervals.sort()

    

    count = 0

    current_end = 0

    i = 0

    n = len(intervals)

    heap = []

    

    while current_end < L:

        # 将所有覆盖当前区域的区间加入堆

        while i < n and intervals[i][0] <= current_end:

            heapq.heappush(heap, -intervals[i][1])  # 使用负数模拟最大堆

            i += 1

        

        if not heap:

            return -1  # 没有可用的区间,无法覆盖

        

        # 选择覆盖最远的区间

        max_end = -heapq.heappop(heap)

        if max_end <= current_end:

            return -1  # 无法覆盖当前区域

        

        current_end = max_end

        count += 1

    

    return count


def main():

    input = sys.stdin.read().split()

    ptr = 0

    T = int(input[ptr])

    ptr += 1

    for _ in range(T):

        n = int(input[ptr])

        L = int(input[ptr + 1])

        W = int(input[ptr + 2])

        ptr += 3

        sprinklers = []

        for _ in range(n):

            pos = int(input[ptr])

            r = int(input[ptr + 1])

            sprinklers.append((pos, r))

            ptr += 2

        result = min_sprinklers(n, L, W, sprinklers)

        print(result)


if __name__ == "__main__":

    main()

点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论