TCHS
08, Раунд 2, Треугольная подпоследовательность
(TriangularSubsequence)
Три числа x, y, z удовлетворяют неравенству
треугольника, если выполняются условия:
x + y > z, x
+ z > y, y + z > x
Последовательность b0, b1, …, bn-1
называется треугольной, если удовлетворяют неравенству треугольника bi, bj, bk
для всех разных значений i, j, k.
В заданном массиве чисел a найти
длину наибольшей треугольной подпоследовательности.
Класс: TriangularSubsequence
Метод: int longest(vector<int> a)
Ограничения: a содержит
от 1 до 50 элементов, 1 £ a[i] £ 109.
Вход. Массив чисел a.
Выход. Длина наибольшей треугольной
подпоследовательности в массиве a.
Пример входа
a |
{2,3,4,1,3,4,5} |
{1,2,3} |
{1,1,1,1,1,1,1,1} |
Пример выхода
5
2
8
РЕШЕНИЕ
обработка последовательностей
Длина искомой
подпоследовательности не меняется при перестановке чисел массива a. Отсортируем
числа массива по неубыванию. Если 0 < x
£ y £ z, то для удовлетворения неравенства треугольника достаточно
проверить неравенство x + y > z, так как остальные два выполняются автоматически.
Рассмотрим
последовательность b0, b1, …, bn-1, у которой b0 £ b1 £ … £ bn-1.
Если n £ 2, то последовательность треугольная по определению.
Рассмотрим случай, когда n ³ 3. Опишем условия, при которых
последовательность bi
будет треугольной. Очевидно, что b0
+ b1 ³ bn-1 (любая тройка чисел bi,
bj, bk должна удовлетворять неравенству треугольника). В то
же время для любых трех индексов 0 £ i < j < k < n имеют
место неравенства: bi + bj
≥ b0 + b1 > bn-1 ≥ bk.
Отсюда следует, что последовательность b0 £ b1 £ … £ bn-1
является треугольной тогда и только тогда, когда b0 + b1
> bn-1.
Сортируем исходный массив а длины
n. Перебираем индексы 0 £ i £ n – 3, i + 2 £ j £ n – 1, проверяя, является ли подпоследовательность ai, ai+1,
…, aj треугольной. Ответ
будет утвердительным, если ai
+ ai+1 > aj. В переменной res подсчитываем длину наибольшей
треугольной подпоследовательности. Если длина n массива а меньше 2, то ответ равен n. Иначе перед запуском двойного цикла значение res инициализируем 2.
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
class TriangularSubsequence
{
public:
int longest(vector<int>
a)
{
int i,j,res=min(2,(int)a.size());
sort(a.begin(),a.end());
for(i=0;i<a.size()-1;i++)
for(j=i+2;j<a.size();j++)
if (a[i] + a[i+1] > a[j]) res =
max(res,j - i + 1);
return res;
}
};