|
0 / 0 / 0
Регистрация: 11.01.2025
Сообщений: 4
|
|
За один ход увеличить или уменьшить любой элемент массива на 1, всего таких операций можно сделать не больше K11.01.2025, 17:09. Показов 5786. Ответов 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-а? |
| 11.01.2025, 20:02 | ||||||
|
Не вижу ничего интересного. Ну просто пытаемся сделать одинаковые элементы для каждого, в примере для 3, 5, 8 и.т.д. и выбираем наилучший. Основная проверка
Добавлено через 12 минут Не по теме: Да, и простите мое умничанье, но они говорят
0
|
||||||
|
0 / 0 / 0
Регистрация: 11.01.2025
Сообщений: 4
|
|
| 11.01.2025, 20:07 [ТС] | |
|
А разве асимптотика не будет O(n2) ? Или я что-то не так понял?
Не по теме: Да, знаю, но I_have_a_question было слишком длинным, пришлось сократить. i_have_questions тоже было слишком длинным, так что пришлось грамматику сломать, хехе.
0
|
|
| 11.01.2025, 22:02 | ||
|
5 3 3 2 3 3 5 При k = 5 и поиске "от двойки" будет макс = 4 (хоть вперед хоть назад). Но есть макс больше = 5. Придется еще перебрать все "средние" диапазоны Не по теме: I've_a_question
0
|
||
|
0 / 0 / 0
Регистрация: 11.01.2025
Сообщений: 4
|
||||||
| 11.01.2025, 22:24 [ТС] | ||||||
|
И я не совсем понял. То есть, для каждого элемента, мы находим макс. длину подотрезка с началом (или концом) в этом элементе, так? Но это же будет долго работать, или...?
Добавлено через 20 минут Что-то в таком духе?
0
|
||||||
| 12.01.2025, 04:30 | |||
|
0
|
|||
|
0 / 0 / 0
Регистрация: 11.01.2025
Сообщений: 4
|
|||||||||||||||||
| 12.01.2025, 12:18 [ТС] | |||||||||||||||||
Или надо третий цикл (
0
|
|||||||||||||||||
| 12.01.2025, 19:19 | ||||||
|
Долго объяснять, проще написать
0
|
||||||
|
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,699
|
||
| 12.01.2025, 20:33 | ||
|
Вопрос №1: Допустим есть некий подотрезок. Как определить, по какому числу b нужно выровнять все числа, чтобы затратить минимум операций? Ответ: нужно взять медиану последовательности чисел. (Что-то я пока не могу сообразить, как доказать.)
Вопрос №2: Как рассчитать то самое минимальное число потраченных операций для подотрезка, рассмотренного в вопросе №1? Ответ: нужно просуммировать числа, превышающие медиану, и вычесть из них все числа, меньше медианы. (Это просто доказывается.) Как обычно, применяем динамическое программирование: У нас уже есть некий оптимальный подотрезок длины m с медианой b. Мы просто добавляем новый элемент слева или справа от этого подотрезка, если это возможно. Допустим слева элемент c, а справа - d. Выбираем наиболее близкий элемент к медиане. Нужно научиться считать скользящую медиану и скользящую сумму отклонений. Ничего сложного в этом вроде нет. Добавлено через 3 минуты Доказательство про медиану методом гугления:
0
|
||
|
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,699
|
|
| 13.01.2025, 09:28 | |
|
Вопрос №3. Как вычислять скользящую медиану? ("Скользящая" - это не совсем корректное слово, но я думаю понятное, правильнее говорить о медиане нарастающей последовательности.)
Обычно медиана вычисляется так: элементы сортируются по возрастанию или убыванию, из исходной последовательности A получается последовательность B. При нечётном числе элементов за медиану берётся средний элемент B[(m-1)/2], который делит все числа на две равные части. При чётном числе элементов в середине массива берутся два элемента, берётся среднее значение этих двух чисел. В нашей же задаче можно брать любое целое число между этими двумя числами, без разницы. Для простоты можно брать элемент B[m/2-1] или B[m/2]. Если у нас уже имеется отсортированная последовательность B, то новый элемент слева или справа, наиболее близкий к медиане по значению, вставляется в порядке возрастания (убывания). Нужно обратить внимание, что добавление одного элемента приводит к смене чётности. Самая простая вставка имеет сложность O(N), но можно догнаться до O(log N). Вопрос №4. Как вычислять отклонение от медианы для нарастающей последовательности? В общем случае это делается так: для тех чисел, которые больше медианы, отклонение равно (A[i] - b), где b - наше медианное число, для чисел, которые меньше медианы, отклонение равно (b - A[j]). Итого сумма отклонений равна для нечётного числа элементов sum{(A[i] - b)} + sum{(b - A[j])}. Так как чисел слева и справа от медианы равное количество, то b сокращается и остаётся sum{A[i]} - sum{A[j]}. Для чётного числа элементов следует не забыть про отклонение самих медианных чисел, поэтому появляется дополнительная сумма в конце выражения sum{A[i]} - sum{A[j]} + B[m/2] - B[m/2-1] (формула для возрастающей последовательности B). Думаю, понятно, как при наращивании последовательности наращивать такую сумму? Это чуть сложнее, чем кажется. Нужно очень аккуратно изучить вопрос, как делать безошибочные пересчёты сумм при изменении чётности числа m. Задачка интересная, заставит подумать.
0
|
|
|
Модератор
10361 / 5647 / 3396
Регистрация: 17.08.2012
Сообщений: 17,237
|
|
| 13.01.2025, 23:38 | |
|
Mikhaylo, медиана в том смысле, в котором Вы её здесь описали (сдаётся мне, что Вы взяли вот это определение из богомерзкой Википедии) совершено не подходит для решения данной задачи. Здесь подходит 1-медиана (корявенькое определение в том же богомерзком месте), она же геометрический центр: Википедия - Геометрический центр. Так что, ничего сортировать не нужно. Однако, следует учесть, что для данного случая (евклидова одномерного дискретного пространства) 1-медиан может быть две, а не одна.
0
|
|
|
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,699
|
|
| 14.01.2025, 08:36 | |
|
Спасибо. Но для задачи это лишнее. Для чётного числа элементов m число медиан равно (B[m/2] - B[m/2-1] + 1). Для нечётного числа m определяется лишь одна медиана. Это для целочисленного одномерного пространства.
Покажите, как без сортировки определить медиану.
0
|
|
|
Модератор
10361 / 5647 / 3396
Регистрация: 17.08.2012
Сообщений: 17,237
|
||
| 14.01.2025, 20:12 | ||
|
Сортировка? Да зачем она здесь? Для наглядности? Чтобы была? Я не знаю...
Фактически, искомая медиана, как бы она не называлась - это центр масс (рассматриваемых в данный момент) точек с одинаковыми массами (например, с единичными массами). Замечание: искомая медиана может не совпадать ни с одной точкой. То, что центр масс определить просто - это только так кажется. Его НИКАК нельзя определить, к примеру, как некое среднее арифметическое, или как какую-то центральную точку в отсортированном массиве точек. Первый способ. Есть рекуррентный алгоритм Вайсфельда, описан в Википедии по ссылке выше. Позволяет определить центр тяжести с любой наперёд заданной точностью (может быть, подойдёт точность ε=1). Для данного случая это будет выглядеть так: Критерий окончания вычислений: | yi+1 - yi | < ε Замечу, что в данном случае все "y" должно быть вещественными, иначе во время вычислений возможно зацикливание алгоритма. После окончания вычислений найденное значение "y" нужно будет округлить. Второй способ. Прямиком из геометрии и сопромата. Взято из книги Гашков С. Б., "Центры тяжести и геометрия" - М.: МЦНМО, 2015 (ISBN 978-5-4439-0145-9, УДК 511.2, ББК 22.131, Г24), страница 4:
С моей точки зрения, второй способ удобнее, он позволяет просто определять искомую медиану "на лету", по мере поступления точек. Хотя, с другой стороны, и первый способ тоже позволяет добавлять точки по мере поступления. В этих способах, конечно же, есть подводный камень, куда же без него. Центр масс получается вещественным, и в какую сторону его округлить, нужно выяснять дополнительно. Скорее всего, нужно округление до ближайшего целого, но у меня нет полной уверенности. Абсолютно правильно, но жутко неудобно (требует двух проходов по множеству) будет округление до соседнего целого, при котором сумма расстояний минимальна. ... Ну вот никак не могу понять ход Ваших мыслей... Любопытство меня прямо-таки раздирает. Где в этой задаче, чёрт возьми, требуется сортировка?
0
|
||
|
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
|
||
| 14.01.2025, 20:52 | ||
|
А если это дерево вдобавок ещё сумеет подсчитать сумму элементов на отрезке за O(LogN), то должно получиться решение за O(NLogN).
1
|
||
|
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,699
|
||
| 15.01.2025, 07:32 | ||
|
0
|
||
|
Модератор
10361 / 5647 / 3396
Регистрация: 17.08.2012
Сообщений: 17,237
|
||||
| 15.01.2025, 10:04 | ||||
Формулу для искомой медианы напишите. Подумайте. И получится алгоритм Вайсфельда. ![]()
0
|
||||
|
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,699
|
|||
| 15.01.2025, 10:15 | |||
|
Эпсилон =1 - это некорректно для нашей задачи, для точного ответа надо гораздо меньше. Ведь не факт, что за несколько итераций ошибка не накопится до величины больше 1.
0
|
|||
|
Модератор
10361 / 5647 / 3396
Регистрация: 17.08.2012
Сообщений: 17,237
|
||||
| 15.01.2025, 11:42 | ||||
|
0
|
||||
|
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,699
|
|||
| 15.01.2025, 12:48 | |||
|
Эпсилон может быть 0.001 и этого может быть в некоторых случаях недостаточно.
0
|
|||
| 15.01.2025, 14:05 | |
|
Пусть найдено решение для массива напр 10 элементов. Легко увеличить этот массив так чтобы решение осталось тем же. Самое простое - дополнить чередующимися a и b (a - b > k). Отсюда вывод: анализ всего массива, медианы и.т.п. здесь не проходит.
Как оптимизировать - была такая мысль. Посчитаем и сохраним все "расстояния" (разницы) до первого эл-та (нарастают) и до последнего эл-та (убывают). Тогда можно относительно быстро находить расстояния между любой парой элементов. И относительно быстро искать подходящее в сортированных массивах. Но "скольжение" все равно остается, выигрыш неясен
0
|
|
| 15.01.2025, 14:05 | |
|
Помогаю со студенческими работами здесь
20
Элементы массива уменьшить на 20, умножить на последний элемент и увеличить на число В Элементы массива: увеличить в 2 раза, уменьшить на число А, разделить на первый элемент
Найти максимальный по значению элемент массива и увеличить его в два раза, остальные элементы уменьшить на значение минимума последней строки массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|