|
0 / 0 / 0
Регистрация: 11.01.2025
Сообщений: 4
|
|
За один ход увеличить или уменьшить любой элемент массива на 1, всего таких операций можно сделать не больше K11.01.2025, 17:09. Показов 7154. Ответов 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,820
|
|
| 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
|
||||||||||||
|
Модератор
10476 / 5771 / 3411
Регистрация: 17.08.2012
Сообщений: 17,528
|
||
| 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,900
|
|
| 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,900
|
|||||||
| 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,820
|
|
| 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,820
|
|
| 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,900
|
||||||||
| 16.01.2025, 20:14 | ||||||||
|
Добавлено через 2 минуты Обнаружил ошибку в вычислении второй границы диапазона медиан (не учитывается, что может быть несколько одинаковых чисел), которую легко исправить. Добавлено через 13 минут
0
|
||||||||
|
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,820
|
||
| 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,900
|
||||||
| 17.01.2025, 01:03 | ||||||
|
Если его длина нечётная, то существует один средний элемент M. Это медиана. Если его длина чётная, то существует два средних элемента (L, H). Все числа отрезка [L..H] являются медианами. В первоначально описанном варианте деление пополам - это поиск заданного значения в отсортированном массиве. Количество шагов принимает минимальное значение для медиан и монотонно возрастает (неубывающая последовательность) при удалении от неё. Получается как бы отсортированный массив значений количества шагов, где индексом является число, расстояние до которого мы считаем. Добавлено через 3 минуты
0
|
||||||
|
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,820
|
|||
| 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,820
|
|
| 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,900
|
|||||
| 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 раза, уменьшить на число А, разделить на первый элемент
Найти максимальный по значению элемент массива и увеличить его в два раза, остальные элементы уменьшить на значение минимума последней строки массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|