Посмотрите на высокий, тонкий, прямоугольный треугольник с основанием a
, высотой b
и гипотенузой c
.
Сначала a
и b
всегда меньше, чем c
и c = sqrt(a*a+b*b)
, так что, как говорили другие авторы, вам нужно искать только по a
и b
.
Вы также знаете, что a+b >= c
, поэтому нет смысла смотреть на маленькие пары a,b
.
Теперь предположим, что вы начинаете с a=0, b=500
, поэтому c==500
, а общий периметр равен 1000.
Теперь вы увеличиваете a
на 1 и рассчитываете периметр. Это будет чуть больше 1000.
Тогда вы уменьшите b
на 1. Тогда периметр будет чуть меньше 1000.
Затем увеличивайте a
на 1, пока периметр не станет> 1000 снова.
Итак, пока периметр <= 1000, увеличьте <code>a.
Пока это> 1000, уменьшите b
.
Если оно равно 1000, у вас есть один ответ. Тогда продолжай.
Вам нужно делать это только до тех пор, пока a<b
.
Этот алгоритм должен быть O(N)
, потому что он не тратит время на маленькие пары.
Тогда все, что вам нужно сделать, это доказать себе, что он не пропустит ни одного ответа.
Вы делаете это, предполагая, что есть правильный a,b
ответ, который он пропускает, и показываете, что это невозможно.