当前位置: 首页 > news >正文

滁州市工程建设网站上一篇 下一篇 wordpress

滁州市工程建设网站,上一篇 下一篇 wordpress,进入网络管理的网站,自助网站建设方法📌 最小半径覆盖问题【C解法二分扫描线】 🧩 题目描述 在平面上给定 $n$ 个二维点,其坐标分别为 $(x_i, y_i)$。现在需要在坐标平面上以某一点为圆心画一个圆,且圆心必须位于坐标轴上(即 $x$ 轴或 $y$ 轴上&#xff09…

📌 最小半径覆盖问题【C++解法+二分+扫描线】

🧩 题目描述

在平面上给定 $n$ 个二维点,其坐标分别为 $(x_i, y_i)$。现在需要在坐标平面上以某一点为圆心画一个圆,且圆心必须位于坐标轴上(即 $x$ 轴或 $y$ 轴上),使得该圆能够覆盖不少于 $\lceil \frac{n}{2} \rceil$ 个点

请你求出满足条件的最小半径。


📥 输入格式

第一行输入一个整数 n,表示点的数量。接下来 n 行,每行输入两个整数 xi 和 yi,表示第 i 个点的坐标。

📤 输出格式

输出一个实数,表示满足要求的最小半径,保留 6 位小数。

✅ 判题要求

设你的输出为 $x$,标准答案为 $y$,当且仅当:

∣x−y∣≤10−6 |x - y| \leq 10^{-6} xy106

你的答案将被接受。


📘 输入示例 1

2
0 0
3 4

🎯 输出

0.000000

解释:取圆心为 (0, 0),半径为 0,即可覆盖第一个点,满足 $k = \lceil \frac{2}{2} \rceil = 1$。


📘 输入示例 2

4
1 0
2 0
3 0
100 100

🎯 输出

0.500000

解释:选圆心为 (1.5, 0),半径 0.5,能覆盖 (1, 0)、(2, 0),满足覆盖 $\geq 2$ 个点。


💡 解题思路

本题核心思想是:

二分半径 + 扫描线验证覆盖数量

Step1:半径二分查找

  • 定义二分查找区间:$[0, 3 \times 10^5]$
  • 每次取中值 $mid$,判断是否存在一个圆心在坐标轴上的圆半径为 $mid$,能覆盖 $\geq k = \lceil \frac{n}{2} \rceil$ 个点。

Step2:扫描线 + 区间合并判断可行性

对于一个给定半径 $r$,判断是否可以用一个圆心在某条坐标轴上的圆覆盖 $\geq k$ 个点:

  • 圆心在 $x$ 轴:若 $|y_i| \leq r$,则点 $(x_i, y_i)$ 可被横轴上的某个圆心覆盖,计算可行的 $x$ 范围区间。
  • 圆心在 $y$ 轴:若 $|x_i| \leq r$,则点 $(x_i, y_i)$ 可被纵轴上的某个圆心覆盖,计算可行的 $y$ 范围区间。
  • 将这些区间看作“事件”,利用扫描线统计同时覆盖最大点数是否 $\geq k$。

🧠 复杂度分析

  • 二分次数为 $O(\log_2(\text{精度})) \approx 60$
  • 每轮中,判断是否可行:$O(n \log n)$(排序 + 扫描)
  • 总体时间复杂度:$O(n \log n \log \text{精度})$

🧾 C++代码实现(附详细注释)

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;typedef pair<double, int> Event;// 检查是否存在一个半径为r的圆,能在坐标轴上找到圆心覆盖至少k个点
bool check(double r, const vector<pair<double, double>>& points, int k) {// 判断横轴或纵轴是否有可行解auto scan = [&](int axis) -> bool {vector<Event> events;for (const auto& [x, y] : points) {if (axis == 0) {  // 圆心在x轴上if (abs(y) > r) continue;double d = sqrt(r * r - y * y);events.emplace_back(x - d, 1);events.emplace_back(x + d, -1);} else {  // 圆心在y轴上if (abs(x) > r) continue;double d = sqrt(r * r - x * x);events.emplace_back(y - d, 1);events.emplace_back(y + d, -1);}}if ((int)events.size() < 2 * k) return false;// 排序:相同位置时,+1 比 -1 优先sort(events.begin(), events.end(), [](const Event& a, const Event& b) {return a.first == b.first ? a.second > b.second : a.first < b.first;});int cnt = 0;for (const auto& [pos, val] : events) {cnt += val;if (cnt >= k) return true;}return false;};return scan(0) || scan(1);
}int main() {int n;cin >> n;vector<pair<double, double>> points(n);for (int i = 0; i < n; ++i) {cin >> points[i].first >> points[i].second;}int k = (n + 1) / 2;  // 至少覆盖一半double lo = 0.0, hi = 3e5;for (int iter = 0; iter < 60; ++iter) {double mid = (lo + hi) / 2;if (check(mid, points, k))hi = mid;elselo = mid;}printf("%.6f\n", hi);return 0;
}

📎 总结

  • 本题属于几何优化 + 二分答案 + 扫描线结合的综合题。
  • 注意容错:由于实数精度问题,建议二分迭代 60 次。
  • C++ 中 sqrt 计算非常高效,printf("%.6f") 控制精度为关键!
http://www.dtcms.com/a/396038.html

相关文章:

  • 网站后台管理系统界面手机做服务器建网站
  • 搜索引擎站长平台百度首页排名优化多少钱
  • 阿里云 Hologres 登顶 VectorDBBench 性价比榜单四项第一
  • 如何不花钱做网站福建省效能建设网站
  • 全屏网站制作深圳出台科技支持政策
  • 网站开发所需费用教育网站开发需求分析
  • asp.net网站开发全过程在哪可以建一个网站
  • 建设机械 官方网站北京网站关键词优化推荐
  • 创建网站如何注册网页界面设计内容
  • 任县网站建设公司重庆的汽车网站建设
  • 权限管理不合理如何避免越权与泄露风险
  • XSS 跨站脚本攻击与防御 - 第二章:XSS 利用方式剖析
  • 大型网站后台用什么语言公司网站域名更改怎么做
  • 经营网站 备案注册会计师官网登录入口
  • 北流网站建设营销营网站建设
  • 手机百度网站证书过期wordpress 角色权限表
  • 企业网站制作费用卖印花图案设计网站
  • XSSer工具使用
  • 路由器 NAT 设置攻略:解决外网与内网通信难题
  • 网站免费正能量直接进入检察官高德地图有没有vr全景
  • 亚购物车功能网站怎么做的中国机械加工网最新订单
  • php初学者网站中国最大的销售网站
  • 佰力博检测与您探讨铁电测试的主要测试内容与行业应用
  • 【场景题】如何设计一个短链系统
  • 【学习率调整】batch_size与学习率关系
  • Windows 系统部署 清华团队开源的 Kronos 金融 K 线基础模型——基于 EPGF 架构
  • vue2 安装Element UI的组件和ECharts插件
  • 函数计算进化之路:AI 应用运行时的状态剖析
  • 为什么人工智能用Python?
  • 【OCR识别工具】旗讯 OCR:开源 + 结构化输出,多场景 OCR 需求一站解决!