|
0 / 0 / 0
Регистрация: 11.01.2025
Сообщений: 4
|
|
За один ход увеличить или уменьшить любой элемент массива на 1, всего таких операций можно сделать не больше K11.01.2025, 17:09. Показов 7111. Ответов 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
|
||||||||||||
|
Модератор
10468 / 5764 / 3410
Регистрация: 17.08.2012
Сообщений: 17,519
|
||
| 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,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,898
|
||||||||
| 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,898
|
||||||
| 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,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 раза, уменьшить на число А, разделить на первый элемент
Найти максимальный по значению элемент массива и увеличить его в два раза, остальные элементы уменьшить на значение минимума последней строки массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
|
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
|
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время?
Никакой пенсии. Никакого нового. . .
|