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

【几何】个人练习-Leetcode-1453. Maximum Number of Darts Inside of a Circular Dartboard

题目链接:https://leetcode.cn/problems/maximum-number-of-darts-inside-of-a-circular-dartboard/description/

题目大意:给出一系列点和一个圆的半径,(寻找一个圆心)求这个半径的圆最多能覆盖多少个点。

思路:几何上,如果一个圆能够覆盖N个点,那么在这N个点中,一定存在两个点,使得这个圆移动一下使得这两个点在圆上后,依然能够覆盖这原来N个点(详细的证明看网站上的题解,感觉还是比较intuitive的)。因此只需要遍历点对,寻找过这两个点,半径为r的圆的圆心,再计算这个圆覆盖的点数,求最大即可。注意两个点一个半径并无法确定圆心,因为这个圆心可能有两个,对称的,在纸上画画就能看出来。

然而代码写起来是有点繁杂,好多地方忘了用浮点数,debug了挺久。并且在判点是否在圆内圆外的函数中,我本地IDE上只需要>=0就行了,但这样子在leetcode网站上总有case过不了,跑出来答案不一样。于是修改了一下boundary,才通过。

完整代码

class Solution {
public:inline int calD(vector<vector<int>>& darts, int r2, double cx, double cy) {int num = 0;for (auto d : darts) {double dis2 = (d[0] - cx) * (d[0] - cx) + (d[1] - cy) * (d[1] - cy);if (r2 - dis2 >= -1e-5)num++; }return num;}int numPoints(vector<vector<int>>& darts, int r) {int n = darts.size();int ans = 1;int r2 = r*r;for (int i = 0; i < n; i++) {for (int j = i+1; j < n; j++) {double midx = 1.0*(darts[i][0] + darts[j][0]) / 2;double midy = 1.0*(darts[i][1] + darts[j][1]) / 2;double half = sqrt((darts[i][0] - darts[j][0]) * (darts[i][0] - darts[j][0]) + (darts[i][1] - darts[j][1]) * (darts[i][1] - darts[j][1]))/2;double p = sqrt(r*r - half*half);if (darts[i][0] == darts[j][0]) {ans = max(ans, calD(darts, r2, darts[i][0] + p, midy));ans = max(ans, calD(darts, r2, darts[i][0] - p, midy));}else if (darts[i][1] == darts[j][1]) {ans = max(ans, calD(darts, r2, midx, darts[i][1] + p));ans = max(ans, calD(darts, r2, midx, darts[i][1] - p));}else {double k = 1.0*(darts[i][1] - darts[j][1]) / (darts[i][0] - darts[j][0]);k = -1.0 / k;ans = max(ans, calD(darts, r2, midx + p * 1 / sqrt(1 + k*k), midy + p * k / sqrt(1 + k*k)));ans = max(ans, calD(darts, r2, midx - p * 1 / sqrt(1 + k*k), midy - p * k / sqrt(1 + k*k)));}}}return ans;}
};
http://www.lryc.cn/news/446731.html

相关文章:

  • 啤酒:从饮品到文化的演变
  • Java 中 Map 常用类和数据结构详解
  • 实时监控,动态调整 —— 淘宝商品详情API助力商家实现灵活经营
  • WebGL常用接口和事件
  • Golang | Leetcode Golang题解之第429题N叉树的层序遍历
  • 数据库的全透明加密和半透明加密主要是针对数据存储安全的不同处理方式
  • MySQL的登录、访问、退出
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-25
  • PyTorch框架安装
  • 分布式锁优化之 使用lua脚本改造分布式锁保证判断和删除的原子性(优化之LUA脚本保证删除的原子性)
  • 从安防视频监控行业发展趋势看EasyCVR平台如何驱动行业智能升级
  • TIOBE 编程指数 9 月排行榜公布 VB.Net第七
  • 如何用ChatGPT制作一款手机游戏应用
  • 0基础学前端 day4
  • 功能测试详解
  • <Java>String类型变量的使用
  • JavaScript可视化
  • HTML5简介的水果蔬菜在线商城网站源码系列模板3
  • 传输层TCP协议
  • 自己开发一个网站系列之-网页开发初识
  • 【代码随想录训练营第42期 Day61打卡 - 图论Part11 - Floyd 算法与A * 算法
  • docker和ufw冲突问题
  • Java(基本数据类型)( ̄︶ ̄)↗
  • 283. 移动0
  • Mysql删库跑路,如何恢复数据?
  • 【HarmonyOS】应用引用media中的字符串资源如何拼接字符串
  • 打开ffmpeg编码器的时候报错:avcodec_open2()返回-22
  • R包:ggheatmap热图
  • springboot实战学习(7)(JWT令牌的组成、JWT令牌的使用与验证)
  • 如何使用numpy反转数组