解题思路:
注意事项:
参考代码: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()
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复