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()

做题思路总结:

  1. 读取输入:首先读取点的数量n和目标点权和m。
  2. 计算距离平方:对于每个点,计算它到原点的距离平方(x^2 + y^2),并将这个值与点权一起作为一个元组存储在列表中。
  3. 排序:将所有点按照距离平方进行排序,这样可以确保我们从最近的点开始累加点权。
  4. 累加点权:遍历排序后的点,累加每个点的点权,直到累加的点权和达到或超过目标点权和m。
  5. 输出结果:如果找到了满足条件的点权和,则输出对应点的距离平方的平方根(即圆的半径),否则输出-1表示无法达到目标点权和。

这个算法的核心在于通过排序和累加来找到最小的半径,使得圆内包含的点的点权和达到目标值。时间复杂度为O(n log n),由于排序操作,空间复杂度为O(n)。