- 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;
}
проверяет, можно ли убрать только один элемент из последовательности, чтобы она стала постоянно возрастающей.
g0_1494089160669 28.03.2018 13:24 # 0
noserdan 28.03.2018 14:46 # +1
noserdan 28.03.2018 14:48 # 0
1024-- 28.03.2018 18:55 # +2
http://govnokod.ru/22738#comment409233
Думаю, ничего полезного в этих комментариях нет, разгадавший их максимум найдёт уязвимость в говнокоде inho или получит IP от какого-нибудь прокси, через который спамит g0_***.
noserdan 29.03.2018 08:17 # 0
bormand 29.03.2018 08:42 # 0
noserdan 29.03.2018 14:22 # 0
в плане - нах энтот спам, я не разумею
1024-- 29.03.2018 16:35 # +1
http://govnokod.ru/22738#comment409233
Этот спам нужен, чтобы можно было на другом сайте подтвердить свою учётную запись с этого сайта - чтобы в будущем все точно знали, что вот это Борманд, вот это спамер g0_циферки.
ссылка доступна для владельцев платных аккаунтов
roman-kashitsyn 29.03.2018 14:43 # 0
Код не читал, но подозреваю, что это тест трансфера аккаунтов на .xyz, мы как-то обсуждали похожий способ в комментах.
bormand 29.03.2018 14:45 # 0
PaulDenisevich 29.03.2018 16:20 # 0
gost 28.03.2018 15:39 # 0
gost 28.03.2018 15:51 # 0
gost 28.03.2018 15:59 # 0
Хм, интересно, а можно короче?
roman-kashitsyn 28.03.2018 16:58 # 0
Ты правильно сначала сделай, а потом уже сокращай.
almostIncreasingSequence({1, 2, 0, 3}) => false
roman-kashitsyn 28.03.2018 16:55 # +1
noserdan 29.03.2018 08:11 # 0
noserdan 29.03.2018 08:15 # 0
roman-kashitsyn 29.03.2018 12:03 # +2
Идея решения на самом деле простая: исходная последовательность должна быть конкатенацией двух строго возрастающих подпоследовательностей, которые можно склеить вместе, выкинув хвост первой или голову второй.
Основная часть проверок нужна для того, чтобы обработать подпоследовательности из одного элемента.
Если в голове последовательности приклеить виртуальную минус-бесконечность, которая меньше всех элементов массива, а к хвосту — виртуальную плюс-бесконечность, которая больше всех элементов массива, то примерно половина проверок не нужна, т.к. тогда каждая подпоследовательность либо будет пустой, либо будет состоять из двух элементов и более. Вот только для инта таких бесконечностей не существует.
roman-kashitsyn 29.03.2018 12:51 # +1
noserdan 29.03.2018 14:03 # 0
вот если так говорить, это только еще больше запутывает, особенно дальнейшее объяснение)
vistefan 01.04.2018 12:37 # 0
Алгоритм в общих чертах такой:
Проходим по последовательности и проверяем, что каждый следующий член строго (или нестрого, в зависимости от условий задачи) больше предыдущего. Если нашли такой, который меньше -- увеличиваем счетчик на единицу. Если после прохода по последовательности оказывается, что такой член только один, значит можно убрать его из последовательности, и она станет возрастающей. Можно вернуть положительный ответ.
bormand 01.04.2018 12:39 # 0
vistefan 01.04.2018 12:43 # +1
vistefan 01.04.2018 12:51 # 0
Но при такой модели напрашивается квадратный алгоритм, (проверять для каждой точки оставшуюся часть последовательности), хотя можно за один проход, как я написал ниже.
vistefan 01.04.2018 12:33 # +1
Чо-то хуйня какая-то. Вот же:
Котировки валют видели когда-нибудь, где рост относительно предыдущего значения обозначается зеленым столбиком, падение -- красным. Так вот достаточно за один проход по последовательности проверить, что красных столбиков не более или в точности равно одному, в зависимости от задачи.
noserdan 02.04.2018 13:48 # 0
noserdan 02.04.2018 14:03 # 0
noserdan 02.04.2018 14:05 # 0
10, 1, 2, 3, 4, 5
vistefan 02.04.2018 14:15 # 0
Про случай, когда надо выкинуть первый элемент [10, 1, 2, 3, 4, 5] я совсем не подумал. Но должно хватить костылика: Понимаешь, почему это сработает, да?
noserdan 02.04.2018 14:10 # 0
1, 2, 3, 4, 99, 5, 6
123, -17, -5, 1, 2, 3, 12, 43, 45
vistefan 02.04.2018 14:22 # 0
А, да, этот пример показывает, что мой метод полная хуйня.
Забудь его, и делай, как сказал Роман.
noserdan 02.04.2018 14:29 # 0
переписывать стоит, если понял решение, а там есть вещи мне незнакомые
roman-kashitsyn 03.04.2018 13:20 # +2
Я не понимаю, почему все хотят решить задачу в одном цикле, это же неудобно, надо хранить какие-то лишние состояния (removed/count/b2/etc).
Если решать так, как я объяснял, то никакой мутабельности и сложных переходов: находим, где одна подпоследовательность рвётся и начинается другая, пытаемся приклеить. Не надо трекать в уме никакие состояния. Код лучше декомпозируется, разделяется на простые функции:
• функция поиска первого места, где подпоследовательность перестаёт быть возрастающей;
• функция, проверяющая, можно ли объединить две возрастающие подпоследовательности, возможно, выкинув один элемент из одной из них.
1024-- 03.04.2018 19:59 # +2
> Если решать так, как я объяснял, то никакой мутабельности и сложных переходов
Вероятно, Вы просто лучше продвинулись по лестнице абстракции. Там у Вас хорошо, дует ветерок, всё просто и понятно.
У нас внизу всё гораздо печальней. Получается либо сложный цикл, либо простой, но за квадратичное время. А написать сложный цикл всё ещё легче, чем подняться на ту же ступеньку абстракции и написать простой цикл.
3.14159265 04.04.2018 17:58 # 0
Что если сохранить начальные индексы отсортированных 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]).
1024-- 08.04.2018 12:40 # 0
3.14159265 04.04.2018 17:44 # +1
Потому что Царь живёт в каждом.
В смысле 1 проход оптимальнее.
Любое разумное существо на интиутивном уровне стремится делать что-то за 1 раз.
bormand 04.04.2018 18:29 # +2
Ну 2 цикла ещё не подразумевают 2 прохода (и тем более — квадратичность). К примеру, первый по первой половине последовательности пробежал, а второй — по оставшейся.
roman-kashitsyn 05.04.2018 01:07 # 0
Оптимально не делать лишних проверок. Например, когда печатаешь список, разделённый запятыми, оптимально сразу проверить на пустоту и вывести первый элемент, а потом написать простой цикл, а не долбить if (first) в цикле.
subaru 05.04.2018 01:11 # 0
Бранчпредиктор зарешает.
1024-- 02.04.2018 20:06 # 0
Вроде работает. Сравнивал с наивной квадратичной питушнёй:
Сравнение:
https://ideone.com/Dba2sx
vistefan 02.04.2018 22:58 # 0
1024-- 03.04.2018 06:20 # 0
Поправил ordered на <= (кстати, в моём коде можно только < на <= в ordered поменять, чтобы поддерживались и неубывающие питухи). Загнал её в своё сравнение с наивным питухом - в итоге даже выдаёт false на массивах длины два.
https://ideone.com/G2RQgO