|
0 / 0 / 0
Регистрация: 11.01.2025
Сообщений: 4
|
|
За один ход увеличить или уменьшить любой элемент массива на 1, всего таких операций можно сделать не больше K11.01.2025, 17:09. Показов 7031. Ответов 77
Метки нет (Все метки)
Дан список A из N чисел, а также число K. Можно за один ход увеличить или уменьшить любой элемент массива на 1, всего таких операций можно сделать не больше K раз.
Какая макс. длина может быть у какого-то подотрезка, в которым все элементы одинаковые? В первой строке два числа - N и K. Во второй строке N чисел, i-тый элемент равен A[i]. Ограничения: 1 ≤ N ≤ 100 000 0 ≤ K ≤ 1 000 000 000 0 ≤ A[i] ≤ 100 000 000 Ввод: 11 7 3 5 8 9 2 7 6 5 3 9 7 Вывод: 4 Объяснение: Можно выбрать отрезок 2-7-6-5. Выполним операцию 4 раза на первом элементе, тогда получаем 6-7-6-5. Выполним операцию 1 раз на втором элементе, итого 5 операции, получаем 6-6-6-5. Выполним операцию на последнем элементе, итого 6 операции, получаем 6-6-6-6. Все элементы одинаковы, значит размер отрезка (4) подходит. Можно показать, что больше такого отрезка, с длиной больше 4, нет.
0
|
|
| 11.01.2025, 17:09 | |
|
Ответы с готовыми решениями:
77
За один ход любое одно из чисел уменьшить на любой степень двойки Описать ход выполнения таких операций Как можно увеличить или уменьшить изображения в Image с помощью TrackBar-а? |
|
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,814
|
|
| 15.01.2025, 19:51 | |
|
Igor3D, чуть попозже разъясню (динамическое программирование).
Cyborg Drone, давайте возьмём простенький пример: [8, 3, 5]. Первое приближение y0 = 7.9 (просто оттолкнулись от первого числа). y1 = {8/(8-7.9)+3/(7.9-3)+5/(7.9-5)}/{1/(8-7.9)+1/(7.9-3)+1/(7.9-5)} = 82.33/10.55 = 7.80 Мда, не быстро идет к правильному и точному ответу median = 5. Добавлено через 24 минуты Динамическое программирование это по сути математический метод индукции в программировании. Если вы решили задачу для чисел [8, 3, 5], то возможно для чисел [8, 3, 5, 2] можно использовать предыдущий результат, немного модифицировав его. Этот метод не всегда работает (иногда приходится заново все пересчитывать с нуля, например, в NP-задачах). В нашей задаче работает. Вот мы нашли медиану median([8, 3, 5]) = 5 и сохранили ранее отсортированный массив [3, 5, 8]. Вставляем в массив новое число 2, получаем [2, 3, 5, 8]. Вставка (не сортировка!!!) - это дешевая операция O(log N). Найти медиану после этого затребует O(1) усилий. Таким образом нахождение скользящей медианы не сложнее сортировки O(N log N). Как и в методе индукции все начинается с единицы. Пользуемся правилом median([a]) = a. И после этого рекурсия пошла-поехала наращивать последовательность до рекордной длины. И нет тут никакой сортировки, просто вставка. Аналогичная ситуация с отклонением от медианы (это что требуется вычислить в задаче). Но на этом не заканчиваются вычисления. Надо перебрать в худшем случае все N чисел (пока лучшего я не придумал, но всё возможно). То есть берём первое число и наращиваем массив, пока затраты не превысят K. Так мы получим N рекордных длин, из них нужно выбрать чемпионскую. Это и будет ответ.
0
|
|
|
32 / 26 / 7
Регистрация: 22.02.2019
Сообщений: 111
|
||||||||||||
| 15.01.2025, 22:00 | ||||||||||||
|
Собственно дерево:
0
|
||||||||||||
|
Модератор
10465 / 5761 / 3410
Регистрация: 17.08.2012
Сообщений: 17,518
|
||
| 16.01.2025, 01:52 | ||
|
0
|
||
|
32 / 26 / 7
Регистрация: 22.02.2019
Сообщений: 111
|
||||||
| 16.01.2025, 10:09 | ||||||
|
Хм, уже увидел ошибку, в программе test в строке 35 должно быть
0
|
||||||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|
| 16.01.2025, 11:05 | |
|
Для текущего окна храним:
- координаты (границы) - длину - медианы (отрезок) - количество шагов В цикле выполняем два действия: 1. Расширяем окно вправо, пока количество шагов <= K (запоминаем лучшую длину) 2. Сужаем окно слева, пока количество шагов > K 3 5 8 9 2 7 6 5 3 9 7 Для наглядности окно буду писать в виде массива, а не границ (в коде будет два индекса). Шаг 1. Инициализация. ([3], 1, [3..3], 0) окно [3], длина 1, медианы [3..3], количество шагов 0 Лучшая длина 1. Шаг 2. Расширение ([3, 5], 2, ?, ?) Так как 3 <= 3 < 5 и 2 чётное, медианы - подотрезок отрезка [3..5]. Количество шагов 2 (вычисляем для медианы 3) = 0 + (5-3). Правую границу (5) находим методом деления пополам. ([3, 5], 2, [3..5], 2) Лучшая длина 2. Шаг 3. Расширение ([3, 5, 8], 3, ?, ?) Так как 3 <= 5 < 8 и 3 нечётное, медианы - отрезок [5..5]. Количество шагов 5 (вычисляем для медианы 5) = 2 + (8-5). ([3, 5, 8], 3, [5..5], 5) Лучшая длина 3. Шаг 4. Расширение ([3, 5, 8, 9], 4, ?, ?) Так как 5 <= 5 < 9 и 5 чётное, медианы - подотрезок отрезка [5..9]. Количество шагов 9 (вычисляем для медианы 5) = 5 + (9-5). Правую границу (8) находим методом деления пополам. ([3, 5, 8, 9], 4, [5..8], 9) Лучшая длина 3. Шаг 5. Сужение ([5, 8, 9], 3, ?, ?) Так как 3 < 5 <= 8 и 3 нечётное, медианы - отрезок [8..8]. Количество шагов 4 (вычисляем для медианы 8) = 9 - (8-3). ([5, 8, 9], 5, [8..8], 4) Лучшая длина 3. Шаг 6. Расширение ([5, 8, 9, 2], 4, ?, ?) Так как 2 < 8 <= 8 и 4 чётное, медианы - подотрезок отрезка [2..8]. Количество шагов 10 (вычисляем для медианы 8) = 4 + (8-2). Левую границу (5) находим методом деления пополам. ([5, 8, 9, 2], 4, [5..8], 10) Лучшая длина 3. И так далее.
0
|
|
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|||||||
| 16.01.2025, 18:11 | |||||||
|
Для нечётной длины медиана - одно число. При расширении окна Для нечётной длины медиана: Если добавляемое число N больше/равно верхней границы H предыдущей медианы, то новая медиана [H..H] Если добавляемое число N меньше/равно нижней границы L предыдущей медианы, то новая медиана [L..L] Иначе новая медиана [N..N] Для чётной длины медиана: Если добавляемое число N больше предыдущей медианы M, то новая медиана [M..X], где X находим методом деления пополам отрезка [M..N] Нам нужно найти такую точку X, что F(X) == F(M), а F(X+1) > F(M) Если добавляемое число N меньше предыдущей медианы M, то новая медиана [X..M], где X находим методом деления пополам отрезка [N..M]. Нам нужно найти такую точку X, что F(X) == F(M), а F(X-1) > F(M) При сужении окна чуть сложнее, но тоже понятно, как сделать. Добавлено через 7 минут Возможно, для определения X проще будет пройтись по всем элементам окна и найти минимальный больше предыдущей медианы (в первом случае) или максимальный меньше предыдущей медианы (во втором случае). Поиск за линейное время, но ширина окна может быть сильно меньше диапазона медиан. Добавлено через 1 час 24 минуты Как-то так:
0
|
|||||||
|
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,814
|
|
| 16.01.2025, 19:08 | |
|
Shamil1, наоборот вместо диапазона медиан нужно взять одну любую (потому что без разницы). Берите первую из медиан для определенности.
Эта часть алгоритма уже понятна давно. Гораздо интереснее, как сократить перебор на самом верхнем уровне циклов. Я предлагал наращивать подпоследовательность чисел слева и справа, может быть это и не надо. Допустим мы начали с некоторого числа, росли вправо и упёрлись в потолок роста. Есть смысл рассмотреть обмен крайнего левого числа на два крайних правых числа. Таким образом подпоследовательность явно более чемпионская, а пересчёт дешёвый. Подпоследовательность может продолжить увеличиваться и ползти вправо. Если настал окончательный тупик, то запоминаем текущую подпоследовательность и начинаем новую подпоследовательность с третьего числа предыдущей подпоследовательности.
0
|
|
|
32 / 26 / 7
Регистрация: 22.02.2019
Сообщений: 111
|
||
| 16.01.2025, 19:22 | ||
|
Самый существенный её недостаток обусловлен использованием BST для вычисления медианы, большой массив вида [42,42,42,42,42...] для него очень неудобный набор. Можно для поддержки динамической медианы попробовать использовать две приоритетные очереди.
0
|
||
|
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,814
|
|
| 16.01.2025, 19:39 | |
|
Пример: 3 5 8 9 2 7 6 5 3 9 7
K=7 1.1 median([3]) = 3, затраты 0. Одно число можно не брать в рассмотрение, переходим сразу к двум: 1.2 median([3, 5]) = 3, затраты 2 1.3 median([3, 5, 8]) = 5, затраты 5 1.4 median([3, 5, 8, 9]) = 5, затраты 9, выше потолка! Пробуем размен (заменяем 3 на 9 и 2): 1.5 median([5, 8, 9, 2]) = 5, затраты 10, выше потолка! 2.1 median([8, 9]) = 8, затраты 1 2.2 median([8, 9, 2]) = 8, затраты 7, потолок! Размен 8 на 7 и 6: 2.3 median([9, 2, 7, 6]) = 6, затраты 8, выше потолка! 3.1 median([2, 7]) = 2, затраты 5 3.2 median([2, 7, 6]) = 6, затраты 5 3.2 median([2, 7, 6, 5]) = 5, затраты 6 3.3 median([2, 7, 6, 5, 3]) = 5, затраты 8, выше потолка! Размен 2 на 3 и 9: 3.4 median([7, 6, 5, 3, 9]) = 6, затраты 8, выше потолка! 4.1 median([6, 5]) = 5, затраты 1 4.2 median([6, 5, 3]) = 5, затраты 3 4.3 median([6, 5, 3, 9]) = 5, затраты 7, потолок! Размен не получается, в последовательности осталось только одно число справа. Хотя ни одного сдвига вправо не вышло, перебор сократился более чем вдвое.
0
|
|
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
||||||||
| 16.01.2025, 20:14 | ||||||||
|
Добавлено через 2 минуты Обнаружил ошибку в вычислении второй границы диапазона медиан (не учитывается, что может быть несколько одинаковых чисел), которую легко исправить. Добавлено через 13 минут
0
|
||||||||
|
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,814
|
||
| 16.01.2025, 21:06 | ||
|
Пример: 3 5 8 9 2 7 6 5 3 9 7 K=7 1+ median([3, 5]) = 3, затраты 2 2+ median([3, 5, 8]) = 5, затраты 5 3+ median([3, 5, 8, 9]) = 5, затраты 9, выше потолка! 4- median([5, 8, 9]) = 8, затраты 4 5+ median([5, 8, 9, 2]) = 5, затраты 10, выше потолка! 6- median([8, 9, 2]) = 8, затраты 7, потолок! 7- median([9, 2, 7]) = 7, затраты 7, потолок! 8- median([2, 7, 6]) = 6, затраты 5 9+ median([2, 7, 6, 5]) = 5, затраты 6 10+ median([2, 7, 6, 5, 3]) = 5, затраты 8, выше потолка! 11- median([7, 6, 5, 3]) = 5, затраты 5 12+ median([7, 6, 5, 3, 9]) = 6, затраты 8, выше потолка! 13- median([6, 5, 3, 9]) = 5, затраты 7, потолок! 14- median([5, 3, 9, 7]) = 5, затраты 8, выше потолка! 14 шагов вместо 16 (15) в предыдущем решении. Добавлено через 4 минуты Shamil1, 14 шагов - безо всякой белиберды в записях типа диапазонов медиан. Впрочем, как я уже писал, пересчёт затрат также поддаётся рекурсии (динамическому программированию). Добавлено через 6 минут Успешная подпоследовательность - это такая, затраты которой не превышают K. Успешные подпоследовательности запоминаем. 1. Если предыдущая подпоследовательность была успешной, но есть ещё ресурс по затратам, то наращиваем справа. 2. Если предыдущая подпоследовательность не была успешной или была успешной, но затраты были равны ровно K (нет ресурса роста), то сдвигаем последнюю успешную подпоследовательность вправо.
0
|
||
| 16.01.2025, 23:41 | |||
|
Чисто технически проблем нет. Это не такая уж редкая ситуация когда с данными надо работать с сортировкой и без. Загоняем индексы в ассоциативный контейнер, напр std::map, где сравниваем по 2 ключам (первый значение, второй индекс). Плюс храним итераторы на мапу для линейного массива. Так несложно прыгать между 2 контейнерами В обильной логике легко ошибиться
0
|
|||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
||||||
| 17.01.2025, 01:03 | ||||||
|
Если его длина нечётная, то существует один средний элемент M. Это медиана. Если его длина чётная, то существует два средних элемента (L, H). Все числа отрезка [L..H] являются медианами. В первоначально описанном варианте деление пополам - это поиск заданного значения в отсортированном массиве. Количество шагов принимает минимальное значение для медиан и монотонно возрастает (неубывающая последовательность) при удалении от неё. Получается как бы отсортированный массив значений количества шагов, где индексом является число, расстояние до которого мы считаем. Добавлено через 3 минуты
0
|
||||||
|
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,814
|
|||
| 17.01.2025, 02:43 | |||
|
0
|
|||
|
32 / 26 / 7
Регистрация: 22.02.2019
Сообщений: 111
|
|||||||||||
| 17.01.2025, 09:40 | |||||||||||
|
С двумя приоритетными очередями.
Вся возня с очередями в отдельном модуле:
1
|
|||||||||||
|
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,814
|
|
| 17.01.2025, 09:52 | |
|
Совет не совсем профессионального программиста остальным программистам: уровни абстракций имеет смысл плодить, только если у вас есть планы и неопределенность дальнейшего развития кода/проекта. Если ваша задача четко сформулирована, то все эти вложенные функции, объекты, конструкторы, деструкторы - это то, чем вы не воспользуетесь, только мешают.
0
|
|
| 17.01.2025, 11:10 | |||
|
Если же нужно просто отслеживать 1 или 2 медианы при изменении окна, то проще использовать сортированный контейнер, напр std::set или std::map (ключ = значение + индекс). При вставке/удалении известно куда "уплывет" медиана, нужно лишь подвинуть ее (итератор на нее) на 1 Добавлено через 22 минуты Да, и если значение медианы изменилось - надо же пересчитать "число съеденных K", всех в окне ?
0
|
|||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|||||
| 17.01.2025, 13:06 | |||||
|
Например, массив [1, 3, 7, 10] Расстояние от 2 равно 15. Расстояние от 3 равно 13. Расстояние от 5 равно 13. Расстояние от 7 равно 13. Расстояние от 8 равно 15. То есть, все числа от 3 до 7 являются медианами (в том смысле, который вкладывается в это слово в данной задаче).
0
|
|||||
| 17.01.2025, 15:59 | |||
|
0
|
|||
| 17.01.2025, 15:59 | |
|
Элементы массива уменьшить на 20, умножить на последний элемент и увеличить на число В Элементы массива: увеличить в 2 раза, уменьшить на число А, разделить на первый элемент
Найти максимальный по значению элемент массива и увеличить его в два раза, остальные элементы уменьшить на значение минимума последней строки массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|