二维平面划分

时间:2015-12-06 07:15:22

标签: c++ math geometry plane

以下是问题陈述:

* Chef正在使用2-D平面上的线条。他知道平面上的每条线都可以用三个系数A,B和C清楚地定义:当且仅当A * x + B * y + C = 0时,任何点(x,y)都在线上。让&# 39;如果不存在属于该集合的两个或更多个不同行的点,则称一组行是完美的。他在飞机上有一组线,他想找出这组中最大的完美子集的大小。

输入

第一行输入包含一个整数T,表示测试用例的数量。每个测试用例由一个表示行数的整数N组成。接下来的N行包含3个空格分隔的整数,每个整数分别表示系数A,B和C.

输出

对于每个测试用例,输出单行中最大完美子集的基数。约束 输入:

1 5 
1 1 0 
1 2 3 
3 4 5 
30 40 0 
30 40 50

输出:2说明 线3 * x + 4 * y + 5 = 0和30 * x + 40 * y + 0 = 0形成最大的完美子集。*

因此,如果As和Bs的比率相同,那么这些线将是并行的,从而满足问题陈述。例如:如果A [1] / B [1] == A [2] / B [2]则这些第一行和第二行是平行的。但是当所讨论的两条线是相同的线时,这意味着存在无数个共同点,这个等式成立,这不是问题想要的。所以我们需要使用C来确定线是否相同(即A [1] / A [2] == B [1] / B [2] == C [1] / C [2]) 。但是我用这些想法编写的代码是如此低效。你们都能建议一个更节省时间的解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以为此编写线性算法。

想法是有一张地图,其中键是方向,值是一组。 对于每个方向,该集合仅包含具有给定方向的不同行。然后答案是较大集合的大小。

let的方向是Ax + By + C = 0。问题是,如果A/B它不能作为一个关键。 您可以为案例B=0设置一个特殊的集合,您将其保持独立并且不会插入到地图中。

您在给定行B=0的集合中插入的值应为Ax + By + C = 0。 在特殊情况下,C/B时,您应使用B = 0