首页 > 试题广场 >

圆覆盖

[编程题]圆覆盖
  • 热度指数:1752 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}在二维平面中给出 n 个点,第 i 个点的坐标为 (x_i,y_i),其点权为 v_i。你可以以原点 (0,0) 为圆心放置一个圆。

\hspace{15pt}设圆的半径为 r,若某点满足 x_i^2+y_i^2\leqq r^2,则认为该点被圆覆盖。请你计算:
\hspace{23pt}\bullet\, 要使被覆盖点的权值和不少于给定整数 S,所需的最小半径 r 是多少?
\hspace{15pt}若无论半径多大都无法达到权值下限,则输出 -1

输入描述:
\hspace{15pt}第一行输入两个整数 n,S\left(1\leqq n\leqq10^5,\ 1\leqq S\leqq10^{14}\right)——点的数量与要求的权值下限。

\hspace{15pt}接下来 n 行,第 i 行输入三个整数 x_i,y_i,v_i\ \left(-10^9\leqq x_i,y_i\leqq10^9,\ 0\leqq v_i<2^{31}\right),描述第 i 个点的坐标与权值。


输出描述:
\hspace{15pt}若存在可行半径,在一行输出该最小半径 r;否则输出 -1

\hspace{15pt}设你的输出为 a,答案为 b。当且仅当

\displaystyle \frac{|a-b|}{\max\bigl(1,|b|\bigr)}<10^{-6}

\hspace{15pt}时,你的答案将被判定为正确。
示例1

输入

5 10
0 1 2
-1 1 3
3 3 4
-4 3 1
5 -3 1

输出

5

说明

当半径为 5 时,(0,1)(-1,1)(3,3)(-4,3) 四个点被覆盖,权值和为 2+3+4+1=10,达到要求。
示例2

输入

5 10
0 1 2
-1 1 3
3 3 2
-4 3 1
5 -3 1

输出

-1

说明

权值和无法达到10
头像 Mag1c0nch
发表于 2024-11-23 15:05:38
每个点到达圆心的距离固定,最终的半径也一定是某点到达圆心的距离,所以维护好每个点到圆心的距离和权值,按距离排序然后顺次选取即可,记得开ll #include <bits/stdc++.h> using namespace std; #define int long long const 展开全文
头像 Silencer76
发表于 2025-08-13 16:24:06
题目链接 圆覆盖 题目描述 在二维平面上给定 个点,第 个点的坐标为 ,其点权为 。你需要以原点 为圆心放置一个圆。 设圆的半径为 ,若某点到原点的距离不大于 (即 ),则该点被圆覆盖。 请计算:要使被覆盖点的权值之和不少于给定的整数 ,所需的最小半径 是多少?若无论半径多大都无法达到权值下 展开全文
头像 Kato_Shoko
发表于 2024-11-25 11:32:34
二分答案 #include <iostream> #include <queue> #include <map> #include <set> #include <cmath> #include <cstring> #inclu 展开全文
头像 阿里嘎多懒羊羊桑_
发表于 2024-11-24 14:39:11
题意平面上有n个点,每个点有一个点权v。你现在可以以原点为圆心放置一个圆,请问要使圆能覆盖到的点的权值和达到x,圆的半径至少为多少?思路最小值问题 先考虑下单调性 点的点权为正整数,如果圆的半径增加,那么能覆盖的点会增大,权值和增大,具有单调性,所以可以二分圆的半径。对于check函数,需要判断在圆 展开全文
头像 wcy_sjtu
发表于 2025-08-12 10:13:26
直接按离原点距离排序,然后累加达到S后打印退出。注意用long来存储S,二分的提示可以忽略。 import java.util.*; class Point { int x,y,v; double d; Point(int x,int y,int v) { 展开全文
头像 是基德吖
发表于 2024-11-25 14:15:08
import java.io.*; import java.util.*; import java.math.BigInteger; public class Main { static class Node { double x, y, v; Node( 展开全文
头像 丨阿伟丨
发表于 2025-09-01 10:44:48
题目链接 圆覆盖 题目描述 在二维平面上有 个带权值的点 。你需要以原点 为圆心放置一个圆,半径为 。 如果一个点满足 ,则该点被圆覆盖。 你需要找到一个最小的半径 ,使得所有被覆盖的点的权值之和不少于给定的整数 。如果无论半径多大都无法达到权值下限,则输出 -1。 解题思路 这是一个求解满足特 展开全文
头像 Feijoa_Li
发表于 2024-11-25 21:07:50
#include "bits/stdc++.h" using namespace std; #define int long long #define pb push_back #define endl "\n" #define x first #defin 展开全文
头像 牛客242693846号
发表于 2025-07-31 15:09:34
from math import sqrt import bisect n, S = map(int, input().split()) points = [list(map(int, input().split())) for _ in range(n)] # 按到原点的距离排序 point 展开全文
头像 开箱即用的贪吃蛇
发表于 2024-12-03 10:33:06
import sys import math def solve(): # 读取点数n和目标点权和m n, m = map(int, sys.stdin.readline().split()) # 初始化一个列表,用于存储点坐标平方和与点权的元组 ve = 展开全文