Leetcode——1453. 圆形靶内的最大飞镖数量

墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。

投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r 。

请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。

示例 1:

输入:points = [[-2,0],[2,0],[0,2],[0,-2]], r = 2
输出:4
解释:如果圆形的飞镖靶的圆心为 (0,0) ,半径为 2 ,所有的飞镖都落在靶上,此时落在靶上的飞镖数最大,值为 4 。

示例 2:

输入:points = [[-3,0],[3,0],[2,6],[5,4],[0,9],[7,8]], r = 5
输出:5
解释:如果圆形的飞镖靶的圆心为 (0,4) ,半径为 5 ,则除了 (7,8) 之外的飞镖都落在靶上,此时落在靶上的飞镖数最大,值为 5 。

示例 3:

输入:points = [[-2,0],[2,0],[0,2],[0,-2]], r = 1
输出:1
示例 4:

输入:points = [[1,2],[3,5],[1,-1],[2,3],[4,1],[1,3]], r = 2
输出:4

提示:

1 ≤ p o i n t s . l e n g t h ≤ 100 1 \le points.length \le 100 1points.length100
p o i n t s [ i ] . l e n g t h = = 2 points[i].length == 2 points[i].length==2
− 1 0 4 ≤ p o i n t s [ i ] [ 0 ] , p o i n t s [ i ] [ 1 ] ≤ 1 0 4 -10^4 \le points[i][0], points[i][1] \le 10^4 104points[i][0],points[i][1]104
1 ≤ r ≤ 5000 1 \le r\le 5000 1r5000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-darts-inside-of-a-circular-dartboard

题解

这算是一道几何题吧,首先考虑一个点的时候,这个时候只要点的距离 d < = r d<=r d<=r的时候就可以被覆盖。
如果是两个点,那么只要满足 d ( p 1 , p 2 ) < = 2 × r d(p_1,p_2)<=2\times r d(p1,p2)<=2×r就可以被圆覆盖,那么如果点的集合的个数大于2呢。
在原来覆盖两个点的基础上,我们要去覆盖一个新的点,如果我们不想舍弃这两个点,那么最极限的状态是什么呢?
在这里插入图片描述

就是当两个点都是边上的时候,就是移动圆心的边界了,再移动就会失去这两个点。基于这个结论,我们可枚举两个点的集合情况,这两个点都是圆上的点,然后根据两个点的坐标推算出圆心的坐标,然后根据得到的圆去计算能够覆盖的点的个数。

那么如果得到圆心的坐标呢?
在这里插入图片描述

假设圆上的两个点为 A , B A,B A,B,作为分别为 ( x a , y a ) (x_a,y_a) (xa,ya) ( x b , y b ) (x_b,y_b) (xb,yb)。那么我们可以得到直线AB的斜率,进而得到了 θ \theta θ的值
θ = arctan ⁡ ( y a − y b x a − x b ) \theta = \arctan(\frac{y_a-y_b}{x_a-x_b}) θ=arctan(xaxbyayb)

对于 A B AB AB的中点的坐标为
m i d = ( x a + x b 2 , y a + y b 2 ) mid = (\frac{x_a+x_b}{2},\frac{y_a+y_b}{2}) mid=(2xa+xb,2ya+yb)
距离 d d d表示为
d = r 2 − d i s t a n c e ( B , m i d ) 2 d =\sqrt{r^2-distance(B,mid)^2} d=r2distance(B,mid)2

那么对于C点 x x x的坐标为
x c = x m i d + d × s i n ( θ ) x_c=x_{mid}+d\times sin(\theta) xc=xmid+d×sin(θ)

同理可得
y c = y m i d + d × c o s ( θ ) y_c = y_{mid} + d\times cos(\theta) yc=ymid+d×cos(θ)

所以C点的坐标为 ( x m i d + d × s i n ( θ ) , y m i d + d × c o s ( θ ) ) (x_{mid}+d\times sin(\theta),y_{mid} + d\times cos(\theta)) (xmid+d×sin(θ),ymid+d×cos(θ))
然后去计算这个圆能够覆盖多少点就行,最后求最大值就是答案。

#define eps 1e-8class Solution {
public:struct Point {double x,y;Point(){}Point(double tx, double ty) {x=tx; y=ty;}};double dist(Point p1,Point p2){return sqrt(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2));}Point GetCircleCenter(Point p1,Point p2,int r){Point mid = Point((p1.x+p2.x)/2,(p1.y+p2.y)/2);double angle = atan2(p1.y-p2.y,p2.x-p1.x);double d = sqrt(r*r-pow(dist(p1,mid),2));return Point(mid.x+d*sin(angle),mid.y+d*cos(angle));}int max(int a,int b){if(a>b)return a;return b;}int numPoints(vector<vector<int>>& points, int r) {int n = points.size();int ans = 1;for(int i = 0;i<n;i++) {for(int j = i+1;j<n;j++) {Point p1 = Point(points[i][0],points[i][1]);Point p2 = Point(points[j][0],points[j][1]);if(dist(p1,p2) > 2.0*r) continue; Point center = GetCircleCenter(p1,p2,r);int cnt = 0;for(int k =0;k<n;k++) {Point pk = Point(points[k][0],points[k][1]);if(dist(center,pk) < 1.0*r+eps) cnt++;}ans = max(ans,cnt);}}return ans;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1619848.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

打印飞镖图形

打印如图下非标 代码如下 #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include<stdio.h> #include<string.h> int main() {int n 0;while (scanf("%d", &n) 1){//上n行int i 0;for (i 0; i < n; i){int j 0;for (j 0…

【数据结构与算法】之深入解析“圆形靶内的最大飞镖数量”的求解思路与算法示例

一、题目要求 墙壁上挂着一个圆形的飞镖靶,现在请你蒙着眼睛向靶上投掷飞镖。投掷到墙上的飞镖用二维平面上的点坐标数组表示,飞镖靶的半径为 r,请返回能够落在任意半径为 r 的圆形靶内或靶上的最大飞镖数。示例 1:输入:points = [[-2,0],[2,0],[

【题解】飞镖

题目描述 小明喜欢玩飞镖游戏&#xff0c;他会把每次的得分都记录在数组中。今天有个飞镖大奖&#xff0c;得奖的规则是&#xff1a;如果你4次飞镖的得分先后是&#xff08;a&#xff0c;b&#xff0c;c&#xff0c;d&#xff09;&#xff0c;满足abcd。 小明准备把记录里的其他…

OpenCV技巧篇——多目标视觉定位(以飞镖定位为例)

OpenCV技巧篇【1】——多目标视觉定位&#xff08;以飞镖定位为例&#xff09; 1、针对问题 多目标视觉定位是指通过计算机视觉技术对一张图片中的多个目标进行识别和定位的过程。本篇将以对飞镖定位为例&#xff0c;提出一个简单有效的多目标定位技巧&#xff0c;最终实现如…

LeetCode 1453. 圆形靶内的最大飞镖数量(几何题)

1. 题目 墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。 投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r 。 请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。 示例 1&#xff1a; 输入&#xff1a;points [[-2,0],[2,0…

一个飞镖模型

#飞镖 #一个角 from turtle import* def angle():pu()goto(0,0)pendown()pencolor("black")left(45)fd(50)left(68)fd(91.73)left(157)fd(120)begin_fill()fillcolor("black")right(135)fd(50)right(68)fd(91.73)right(157)fd(120)end_fill()#飞镖复杂化 d…

扔飞镖游戏

日落西山红霞飞~战士打靶把营归呀巴扎嘿。今天我制作一个简单的打靶游戏&#xff08;扔飞镖&#xff09; 在制作之前首先要思考这个游戏需要什么对象&#xff0c;很简单&#xff0c;一只飞镖、一个靶。 这里我把飞镖设置成了刚体&#xff0c;什么是刚体&#xff1f;简而言之&…

2022赛规整理——飞镖

2022赛规整理——飞镖 ​ V1.0 2021.10.23 1、比赛场地 &#xff08;1&#xff09;打击角度及距离 飞镖口——前哨站&#xff1a;左6.5&#xff0c;直线距离15865mm 飞镖口—— 基地 &#xff1a;右7.3&#xff0c;直线距离25233mm &#xff08;2&#xff09;基地示意图 基…

QT之“飞镖盘”自定义控件

QT之“飞镖盘”自定义控件 前言控件预览实现 前言 现在发一个我之前看过有人写了一个抽奖转盘&#xff0c;所以闲来无事写了一个飞镖盘控件&#xff0c;在我看来它其它没有什么实用价值&#xff0c;纯属写来玩玩而已。 控件预览 实现 画背景 void QDartboard::drawBkg(QPai…

在window上配置NASM

NASM是支持x86、x64架构CPU的汇编器(汇编软件)&#xff1b;NASM也支持大量的文件格式&#xff0c;包括Linux&#xff0c;*BSD&#xff0c;a.out&#xff0c;ELF&#xff0c;COFF&#xff0c;Mach−O&#xff0c;Microsoft 16−bit OBJ&#xff0c;Win32以及Win64&#xff0c;同…

pc单机版雷电修改器源码

记得以前第一次接触电脑玩的第一个游戏就是雷电&#xff0c;那时候觉得这游戏真好玩&#xff0c;很过瘾。闲来没事干&#xff0c;所以想重温一下游戏&#xff0c;&#xff08;当时玩的不是这个版本的雷电&#xff09;&#xff0c;那时候是和小伙伴一起玩的&#xff0c;可惜现在…

《愤怒的小鸟》登陆PC 绿色免安装版首发

这群去年风靡手机的小鸟就不用过多的介绍了&#xff0c;一个月前其开发商游戏开发商Rovio表示将会推出PC版。今天为大家带来的就是绿色免安装版的愤怒的小鸟。 游戏的玩法很简单&#xff0c;将弹弓上的小鸟弹出去&#xff0c;砸到绿色的肥猪&#xff0c;将肥猪全部砸到就能过关…

Pygame小游戏之俄罗斯方块凭什么火了30年?(史上最畅销单机游戏)

前言 一款俄罗斯方块火了30年&#xff0c;成为有史以来最畅销的单机游戏。 它为什么有那么的魔力经久不衰? 小编总结了一些原因&#xff1a;上手极其简单&#xff0c;技巧却很多&#xff0c;满足在混乱中创造秩序的渴望…… 工程师阿列克谢说&#xff0c;人们并没有意识到&…

硬盘图标修改器 V1.0 绿色版

软件名称&#xff1a;硬盘图标修改器 V1.0 绿色版软件语言&#xff1a; 简体中文授权方式&#xff1a; 免费软件应用平台&#xff1a; Win7 / Vista / Win2003 / WinXP / Win2008 软件大小&#xff1a; 12.3MB图片预览&#xff1a; 软件简介:是否厌倦了千篇一律的Windows硬盘图…

Java多线程与并发编程

课程地址&#xff1a; https://www.itlaoqi.com/chapter.html?sid98&cid1425 源码文档&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WMvM3j6qhyjIeAT87kIcxg 提取码&#xff1a;5g56 Java多线程与并发编程 1-并发背后的故事什么是并发 2-你必须知道线程的概念程…

“黑客”入门学习之“单机游戏外挂原理与实现”

“黑客”入门学习之“单机游戏外挂原理与实现”&#xff08;文末全套黑客资料教程&#xff09; 昨天给小伙伴们分享了一篇"游戏外挂原理与实现"的文章&#xff0c;小伙伴们很热情&#xff0c;反响很好&#xff0c;好多朋友私信我&#xff0c;或者直接回复我"写…

PMP P-03 Scope Management

范围管理&#xff1a;要做多少事情&#xff0c;内容

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成 目录 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成。 生成对抗…

代码随想录算法训练营第四十七天|LeetCode 382,115

目录 LeetCode 392.判断子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组 LeetCode 115.不同的子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 …

压缩包密码的破解

给压缩包添加密码 解密 将压缩包的加密信息放入新建的文本文档 zip2john 123.zip > mima.txt 使用john解密 john mima.txt john的密码字典路径 cd /etc/share/john ls 查看有多少行密码