import sys
import math
def solve():
# 读取点数n和目标点权和m
n, m = map(int, sys.stdin.readline().split())
# 初始化一个列表,用于存储点坐标平方和与点权的元组
ve = []
# 读取每个点的坐标和点权,并计算到原点的距离平方,存储到列表中
for _ in range(n):
x, y, v = map(int, sys.stdin.readline().split())
ve.append((x * x + y * y, v))
# 按照距离平方进行排序
ve.sort()
# 初始化点权和
sum = 0
# 遍历排序后的点,累加点权
for distance_squared, value in ve:
sum += value
# 如果累加点权达到或超过目标点权和m,则输出半径并返回
if sum >= m:
print(f"{math.sqrt(distance_squared):.7f}")
return
# 如果无法达到目标点权和,输出-1
print(-1)
# 主函数
def main():
# 解决多个测试用例的情况(这里假设只有一个测试用例)
solve()
# 调用主函数
if __name__ == "__main__":
main()
做题思路总结:
- 读取输入:首先读取点的数量n和目标点权和m。
- 计算距离平方:对于每个点,计算它到原点的距离平方(x^2 + y^2),并将这个值与点权一起作为一个元组存储在列表中。
- 排序:将所有点按照距离平方进行排序,这样可以确保我们从最近的点开始累加点权。
- 累加点权:遍历排序后的点,累加每个点的点权,直到累加的点权和达到或超过目标点权和m。
- 输出结果:如果找到了满足条件的点权和,则输出对应点的距离平方的平方根(即圆的半径),否则输出-1表示无法达到目标点权和。
这个算法的核心在于通过排序和累加来找到最小的半径,使得圆内包含的点的点权和达到目标值。时间复杂度为O(n log n),由于排序操作,空间复杂度为O(n)。

京公网安备 11010502036488号