给定第一象限的坐标列表,计算可以形成多少个边平行于 x 轴的直角三角形
Posted
技术标签:
【中文标题】给定第一象限的坐标列表,计算可以形成多少个边平行于 x 轴的直角三角形【英文标题】:Given a list of coordinates in the first quadrant, calculate how many right triangles can be formed which have one side parallel to x-axis 【发布时间】:2011-01-23 09:52:51 【问题描述】:给定first quadrant
中的坐标列表,计算可以从这些坐标中形成多少个直角三角形,这些三角形的一侧平行于x-axis
,一侧平行于y-axis
。
最近我参加了一个编程竞赛,更具体地说是 INOI(Indian National Olympiad n Informatics),这是论文中两个问题中的第一个。
基本上我认为(a,y)
(x,y)
(x,b)
类型的任何3个点都会形成这样一个三角形但无法更好地管理任何东西,最后只是写了一个天真的O(n^3) 解决方案(我所有的朋友也是如此)。
谁能提出更好的方法?
拜托,这不是家庭作业。
【问题讨论】:
你最多可以得到多少分? 10^4 我认为 1s 是时间限制。记不清是 >10^4 还是 10^4 【参考方案1】:让numX[i] = how many points have i as their X coordinate
和numY[i] = how many points have i as their Y coordinate
。
我们将计算某个点p
存在多少具有所需属性的三角形。不失一般性,我们可以假设p
是三角形形成直角的点。
为此,我们需要一个具有相同Y
坐标的点和一个具有相同X
坐标的点。那么这个算法怎么样:
compute numX and numY in O(n).
num = 0
for each point p in the given list of points
num += (numX[p.X] - 1)*(numY[p.Y] - 1)
output num
基本上,我们可以将具有相同X
坐标的每个点与具有相同Y
坐标的每个点组合起来以获得所需的三角形。我们减去1
,以免算上p
本身。
这将在O(n)
中运行。
【讨论】:
【参考方案2】:是的,我同意 IVlad 的观点。 输入可以直接存储在一个 2*N 数组中,同时每个 x 和 y 的计数应该存储在 numX 和 numY 中......然后就是 wat IVlad 说的......
【讨论】:
以上是关于给定第一象限的坐标列表,计算可以形成多少个边平行于 x 轴的直角三角形的主要内容,如果未能解决你的问题,请参考以下文章