- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
bool almostIncreasingSequence(std::vector<int> sq) {
bool b2 = true;
int s = sq.size();
if (s > 2) { // Последовательность меньше трех чисел дает истину.
int i = 1; // Проверка начинается со второго элемента.
int x = -1; // Для записи индекса элемента <= предыдущего, а еще "флаг".
while ((b2) && (i < s)) { // При нахождении 2-го лишнего происходит выход из цикла.
if (x != -1) { // Проверка "флага".
if (sq[i] <= sq[i - 1]){ // Сравнение с предыдущим элементом.
b2 = false; // Если условие истинно, то это уже второй элемент,
} // "конфликтующий" с предыдущим, следовательно, выход и "ложь".
if ((sq[i] <= sq[x - 1]) && (x != 1) && (sq[i - 1] <= sq[x - 2])) { // над этим условием я думал слишком долго
b2 = false; // Если элемент был "убран", индекс конфликтного
} // элемента записан в "x".
}
else { // Если условие ложно, то записываем индекс элемента, который
if (sq[i] <= sq[i - 1]) { // "конфликтует" с предыдущим.
x = i; // Нам не известно лишний он или нет.
}
}
i++;
}
}
return b2;
}
проверяет, можно ли убрать только один элемент из последовательности, чтобы она стала постоянно возрастающей.
http://govnokod.ru/22738#comment409233
Думаю, ничего полезного в этих комментариях нет, разгадавший их максимум найдёт уязвимость в говнокоде inho или получит IP от какого-нибудь прокси, через который спамит g0_***.
в плане - нах энтот спам, я не разумею
http://govnokod.ru/22738#comment409233
Этот спам нужен, чтобы можно было на другом сайте подтвердить свою учётную запись с этого сайта - чтобы в будущем все точно знали, что вот это Борманд, вот это спамер g0_циферки.
ссылка доступна для владельцев платных аккаунтов
Код не читал, но подозреваю, что это тест трансфера аккаунтов на .xyz, мы как-то обсуждали похожий способ в комментах.
Хм, интересно, а можно короче?
Ты правильно сначала сделай, а потом уже сокращай.
almostIncreasingSequence({1, 2, 0, 3}) => false
Идея решения на самом деле простая: исходная последовательность должна быть конкатенацией двух строго возрастающих подпоследовательностей, которые можно склеить вместе, выкинув хвост первой или голову второй.
Основная часть проверок нужна для того, чтобы обработать подпоследовательности из одного элемента.
Если в голове последовательности приклеить виртуальную минус-бесконечность, которая меньше всех элементов массива, а к хвосту — виртуальную плюс-бесконечность, которая больше всех элементов массива, то примерно половина проверок не нужна, т.к. тогда каждая подпоследовательность либо будет пустой, либо будет состоять из двух элементов и более. Вот только для инта таких бесконечностей не существует.
вот если так говорить, это только еще больше запутывает, особенно дальнейшее объяснение)
Алгоритм в общих чертах такой:
Проходим по последовательности и проверяем, что каждый следующий член строго (или нестрого, в зависимости от условий задачи) больше предыдущего. Если нашли такой, который меньше -- увеличиваем счетчик на единицу. Если после прохода по последовательности оказывается, что такой член только один, значит можно убрать его из последовательности, и она станет возрастающей. Можно вернуть положительный ответ.
Но при такой модели напрашивается квадратный алгоритм, (проверять для каждой точки оставшуюся часть последовательности), хотя можно за один проход, как я написал ниже.
Чо-то хуйня какая-то. Вот же:
Котировки валют видели когда-нибудь, где рост относительно предыдущего значения обозначается зеленым столбиком, падение -- красным. Так вот достаточно за один проход по последовательности проверить, что красных столбиков не более или в точности равно одному, в зависимости от задачи.
10, 1, 2, 3, 4, 5
Про случай, когда надо выкинуть первый элемент [10, 1, 2, 3, 4, 5] я совсем не подумал. Но должно хватить костылика: Понимаешь, почему это сработает, да?
1, 2, 3, 4, 99, 5, 6
123, -17, -5, 1, 2, 3, 12, 43, 45
А, да, этот пример показывает, что мой метод полная хуйня.
Забудь его, и делай, как сказал Роман.
переписывать стоит, если понял решение, а там есть вещи мне незнакомые
Я не понимаю, почему все хотят решить задачу в одном цикле, это же неудобно, надо хранить какие-то лишние состояния (removed/count/b2/etc).
Если решать так, как я объяснял, то никакой мутабельности и сложных переходов: находим, где одна подпоследовательность рвётся и начинается другая, пытаемся приклеить. Не надо трекать в уме никакие состояния. Код лучше декомпозируется, разделяется на простые функции:
• функция поиска первого места, где подпоследовательность перестаёт быть возрастающей;
• функция, проверяющая, можно ли объединить две возрастающие подпоследовательности, возможно, выкинув один элемент из одной из них.
> Если решать так, как я объяснял, то никакой мутабельности и сложных переходов
Вероятно, Вы просто лучше продвинулись по лестнице абстракции. Там у Вас хорошо, дует ветерок, всё просто и понятно.
У нас внизу всё гораздо печальней. Получается либо сложный цикл, либо простой, но за квадратичное время. А написать сложный цикл всё ещё легче, чем подняться на ту же ступеньку абстракции и написать простой цикл.
Что если сохранить начальные индексы отсортированных subsequence in array?
А потом просто сравнить значения по индексам-брейкерам?
//arr= [1, 2, 3, 4, 99, 5, 6]
Сохраняем:
indx=[0, 4, 5]
Делаем все сложные проверки (массив не больше 3х, indx[2]-indx[1]==1, arr[indx[2]]>arr[indx[1]-1]).
Потому что Царь живёт в каждом.
В смысле 1 проход оптимальнее.
Любое разумное существо на интиутивном уровне стремится делать что-то за 1 раз.
Ну 2 цикла ещё не подразумевают 2 прохода (и тем более — квадратичность). К примеру, первый по первой половине последовательности пробежал, а второй — по оставшейся.
Оптимально не делать лишних проверок. Например, когда печатаешь список, разделённый запятыми, оптимально сразу проверить на пустоту и вывести первый элемент, а потом написать простой цикл, а не долбить if (first) в цикле.
Бранчпредиктор зарешает.
Вроде работает. Сравнивал с наивной квадратичной питушнёй:
Сравнение:
https://ideone.com/Dba2sx
Поправил ordered на <= (кстати, в моём коде можно только < на <= в ordered поменять, чтобы поддерживались и неубывающие питухи). Загнал её в своё сравнение с наивным питухом - в итоге даже выдаёт false на массивах длины два.
https://ideone.com/G2RQgO