Хитрость заключается в том, чтобы найти способ классифицировать возможные решения и найти для каждого решения в постоянном пространстве с линейным временем.
Рассмотрим три диапазона X = (0,2/3), Y = [2/3,1], Z = (1,2)
. Из Z
может исходить не более одного значения (если из Z
пришли два значения, то сумма превысит 1+1=2
). Точно так же хотя бы одно значение должно исходить из X
. Предположим, что было 3 значения a <= b <= c
, так что 1 <= a+b+c <= 2
. Затем рассмотрим, какие возможные классы решений допустимы:
A) `a \in X, b \in X, C \in X`
B) `a \in X, b \in X, C \in Y`
C) `a \in X, b \in X, C \in Z`
D) `a \in X, b \in Y, C \in Y`
E) `a \in X, b \in Y, C \in Z`
Итак, как мы можем проверить каждый случай?
Случай A невероятно легко проверить: сумма гарантированно меньше 2, поэтому нам просто нужно проверить, что наибольшая сумма (3 самых больших элемента в X) превышает 1.
Случай C невероятно легко проверить: поскольку сумма гарантированно больше 1, нам нужно только проверить, меньше ли сумма 2. Поэтому для этого нам просто нужно проверить 2 наименьших значения в X и наименьшее значение в Z
Случаи D и E аналогичны C (поскольку сумма должна быть не менее 4/3 > 1, выберите наименьшие возможные значения в каждом классе).
Случай B — единственный сложный случай. 0 < a+b < 4/3
и 2/3 <= c <= 1
. Для обработки случая B мы рассматриваем следующие интервалы: X1 = (0, 1/2), X2 = [1/2 2/3], Y = [2/3, 1].
Это приводит к следующим трем допустимым случаям:
B1. a in X1, b in X2, c in Y
B2. a in X1, b in X1, c in Y
B3. a in X2, b in X2, c in Y
Случай B1 и B3: сумма трех чисел всегда больше 1, поэтому мы берем минимальные значения и проверяем, меньше ли она 2 или нет.
Случай B2: сумма трех чисел всегда меньше 2, поэтому мы берем максимальную сумму и проверяем, больше 1 или нет.
Подводя итог, тесты такие:
|X| >= 3
и Xmax(1) + Xmax(2) + Xmax(3) >= 1
|X| >= 2
, |Z| >= 1
и Xmin(1)+Xmin(2)+Zmin(1) <= 2
|X| >= 1
, |Y| >= 2
и Xmin(1)+Ymin(1)+Ymin(2) <= 2
|X| >= 1
, |Y| >= 1
, |Z| >= 1
и Xmin(1)+Ymin(1)+Zmin(1) <= 2
|X| >= 2
, |Y| >= 1
и Xmax(1) + Xmax(2) + Ymin(1) < 2
|X| >= 2
, |Y| >= 1
и Xmin(1) + Xmin(2) + Ymax(1) > 1
)
Каждый тест может быть выполнен в линейном времени и постоянном пространстве (вам нужно только найти Xmax(1), Xmax(2), Xmax(3), Xmin(1), Xmin(2), Ymin(1), Ymin(2), Ymax(1), Zmin(1)
, все из которых можно найти за один проход, даже если данные не отсортированы)
person
Soul Ec
schedule
24.10.2013