题解 | #圆覆盖#(Python3)

圆覆盖

https://www.nowcoder.com/practice/4f96afe5dfe74dad88dbe419d33f9536

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

#15天刷题#
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-11 13:34
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务