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