贪心_hard_1453_圆形靶内的最大飞镖数量_第189场周赛

题记

  • 第189场周赛最后一题,没做出来。
  • 贴一下排名,再接再厉。
    在这里插入图片描述

题目描述

在这里插入图片描述

思路

  • 任选两个点,假设这两个点在半径为r的圆上,然后确定该圆,再贪心的统计在圆内的最多的点的数量即可。
  • 由于给定半径r, 两个点在圆上的圆(若存在)有两个,这里不用分别计算该两个圆,因为在两层循环遍历的时候,a,b求完一个,下次遍历b,a的时候会求另外一个圆。
  • 证明上述正确性:
    • 直观图如下
      在这里插入图片描述

代码 – Time: O ( n 3 ) O(n^3) O(n3)

from typing import List
from math import sqrt
from math import hypot

class Solution:
    def numPoints(self, points: List[List[int]], r: int) -> int:
      def distance(a, b):
        return sqrt((a[0]-b[0])**2 + (a[1]-b[1])**2)

      J = lambda o: sum(distance(_, o) <= r for _ in points)
      m = 1
      for p1 in points:
        for p2 in points:
          if 0 < distance(p1, p2) <= 2 * r:
            s = [(p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2]
            length = distance(p1, p2)
            z = sqrt(r ** 2 - (length/2)** 2)

            d_unit_vector = [(p1[1] - p2[1])/length, (p1[0] - p2[0])/length]  # 单位向量
            p = [s[0] + d_unit_vector[0] * z, s[1] - d_unit_vector[1] * z]
            m = max(m, J(p))
      return m


po = [[-3,0],[3,0],[2,6],[5,4],[0,9],[7,8]]
r = 5
res = Solution().numPoints(po, r)
print(res)

Reference

this
and this

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值