Вот формулировка проблемы:
* Шеф-повар работает с линиями на двумерной плоскости. Он знает, что каждая линия на плоскости может быть четко определена тремя коэффициентами A, B и C: любая точка (x, y) лежит на прямой тогда и только тогда, когда A * x + B * y + C = 0. Давайте назовем набор линий, который должен быть идеальным, если не существует точки, которая принадлежит двум или более отдельным линиям набора. У него есть набор линий на плоскости, и он хочет выяснить размер наибольшего совершенного подмножества этого набора.
вход
Первая строка содержит одно целое число 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 и B одинаковы, то линии будут параллельными, что соответствует постановке задачи. Например: если A [1] / B [1] == A [2] / B [2], то эти первая и вторая линии параллельны. Но когда две рассматриваемые линии — это одни и те же линии, а это означает, что существует бесконечное число общих точек, это уравнение выполняется, а это не то, чего хочет проблема. Таким образом, нам нужно использовать C, чтобы определить, являются ли линии одинаковыми или нет (то есть A [1] / A [2] == B [1] / B [2] == C [1] / C [2]) , Но код, который я написал с этими идеями, настолько неэффективен. Можете ли вы предложить более эффективное по времени решение?
Вы можете написать линейный алгоритм для этого.
Идея состоит в том, чтобы иметь карту, где ключом является направление, а значением является набор.
Для каждого направления набор содержит только разные линии, которые имеют заданное направление. Тогда ответ — размер большего набора.
Направление линии Ax + By + C = 0
является A/B
, Проблема в том, что если B=0
это не совсем работает в качестве ключа.
Вы можете иметь специальный набор для случая B=0
, который вы держите отдельно и не вставляете в карту.
Значения, которые вы вставляете в набор для данной строки Ax + By + C = 0
, должно быть C/B
,
В особом случае, когда B = 0
, вы должны использовать C/A
,
Других решений пока нет …