Вот ответ O(n log(n))
с достаточным количеством деталей.
Сначала рассортируйте людей по возрастанию красоты, по убыванию силы.Устранить дубликаты.(Либо явно здесь, либо неявно, пропуская их на следующем шаге.)
Пробежаться по списку.На ходу поддерживайте сбалансированное древо людей, которые, возможно, находятся на пути к тому, чтобы стать следующим человеком в максимальной восходящей цепи.Каждый человек должен храниться с длиной текущей цепочки и указателем на связанный список остальных людей в цепочке.Дерево должно быть отсортировано по силе.
Точнее, когда вы видите нового человека, найдите следующего самого слабого человека в дереве (никто не в порядке) и создайте триплет (person, length of chain, pointer to chain)
.Вставьте человека в дерево.Если у следующего более сильного человека в дереве цепочка не длиннее текущего человека, удалите этого человека.Все эти операции: O(log(n))
.
Когда вы закончите обработку всех людей, максимальная запись в дереве будет иметь человека в конце максимальной цепочки людей, длину цепочкии указатель на связанный список с остальными людьми в цепочке.Это ваш ответ, распечатайте его.
Чтобы показать вам ваши примерные данные, вот что вы начинаете:
4
1 1
1 2
2 1
2 2
Это означает:
{person: 1, beauty: 1, strength: 1}
{person: 2, beauty: 2, strength: 1}
{person: 3, beauty: 1, strength: 2}
{person: 4, beauty: 2, strength: 2}
Сортировка по возрастанию красоты, затем уменьшению силы (нет дубликатов), чтобы получить:
{person: 3, beauty: 1, strength: 2}
{person: 1, beauty: 1, strength: 1}
{person: 4, beauty: 2, strength: 2}
{person: 2, beauty: 2, strength: 1}
Чтобы упростить вещи, я просто представлю дерево отсортированным набором.Это не так, как это должно быть представлено в памяти.
После ввода человека 3:
{person: 3, strength: 2, length: 1, next_person: null}
Следующий человек 1 ударяет человека 3.
{person: 1, strength: 1, length: 1, next_person: null}
Затем человек 4идет после человека 1. (Я написал связанный список как вложенную структуру данных, в действительности это должен быть связанный список.)
{person: 1, strength: 1, length: 1, next_person: null}
{person: 4, strength: 2, length: 2, next_person: {person: 1, next_person: null}}
Тогда человек 2 сталкивается с человеком 1.
{person: 2, strength: 1, length: 1, next_person: null}
{person: 4, strength: 2, length: 2, next_person: {person: 1, next_person: null}}
Чтобы найти свой ответ, посмотрите на конец дерева, на человека 4, указывает на человека 1. И ваш ответ - длина 2, а затем (от лучших к худшим) человек 4, затем 1.