|
0 / 0 / 0
Регистрация: 25.11.2022
Сообщений: 19
|
||||||
Найти размер наибольшего братства в массиве (оптимизация кода)09.05.2024, 17:19. Показов 1740. Ответов 13
Метки нет (Все метки)
Задан массив a
состоящий из различных целых положительных чисел. Назовём подмассив ai,ai+1,…,aj братством только в том случае, если существует целое число m≥2 такое, что aimodm=ai+1modm=…=ajmodm, где xmody это математический остаток от целочисленного деления x на y. Вам нужно найти размер наибольшего братства в массиве a. Входные данные В каждом тесте задано несколько независимых наборов входных данных. В первой строке входных данных указано количество этих наборов t (1≤t≤2⋅104). В первой строке каждого набора задано целое число n (1≤n≤2⋅105) – размер массива a. Во второй строке каждого набора содержится n целых положительных чисел a1,a2,…,an (1≤ai≤1018) – составляющих массив a. Гарантируется, что все числа в a различны. Гарантируется, что сумма n по всем наборам входных данных меньше 2⋅105. Выходные данные Выведите t строк. В каждой строке должно содержаться единственное целое число — размер наибольшего братства в a . Мое решение не проходит по времени, я думаю что он неэффективно перебирает m, подскажите как можно оптимизировать код. Братство это рядом стоящие элементы если что. Вот мой код
Входные данные 4 5 1 5 2 4 6 4 8 2 5 10 2 2000 1000 8 465 55 3 54 234 12 45 78 Выходные данные 3 3 2 6 Примечание В первом наборе массив это [1,5,2,4,6]. Наибольшее братство это [2,4,6], поскольку все эти числа имеют остаток 0 по модулю 2, следовательно, m=2. Во втором наборе массив это [8,2,5,10]. Наибольшее братство это [8,2,5], поскольку все эти числа имеют остаток 2 по модулю 3, следовательно, m=3. В третьем наборе наибольшее братство это [2000,1000]. Можно привести несколько подходящих значений m.
0
|
||||||
| 09.05.2024, 17:19 | |
|
Ответы с готовыми решениями:
13
Найти размер наибольшего префикса Найти индекс наибольшего числа в массиве |
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
||||||
| 09.05.2024, 19:09 | ||||||
|
У вас сложность кубическая. Должен быть квадрат.
Есть такое свойство: если два числа имеют одинаковый остаток от деления на m, то их разница делится на m. Это называется "сравнение по модулю m". Отсюда вывод, что одинаковый остаток будет у всех делителей модуля разницы. Единичку, естественно, не считаем. Например, числа 150 и 12. Разница 138. Делители: 2, 3, 6, 23, 46, 69, 138. Например, числа 12 и 47. Разница 35. Делители: 5, 7, 35 Например, числа 150 и 219. Разница 69. Делители: 3, 23, 69 Если три числа имеют одинаковый остаток от деления на m это означает, что наибольший общий делитель (НОД) их разниц отличается от единицы. Например, 150, 12, 47. Разницы -- 138, 35. НОД(138, 25) = 1 -- нет такого числа. Например, 150,219,12. Разницы -- 69,207. НОД(69,207) = 69. Есть такое число. Все числа, дающие в остатке одинаковое число это делители 69 -- 3, 23, 69. При увеличении количества сравниваемых чисел надо брать НОД от НОД. Соответственно, алгоритм примерно такой. Находим разницы всех пар чисел. Получаем массив разностей размером n-1. Проходимся попарно нодами и записываем НОДы в массив размером n-2. Если все 1, то ответ 2, иначе... По резульатам проходимся попарно НОДами, записывая в массив размером n-3. Если все 1, то ответ 3, иначе... и так далее, уменьшая размер нового массива на единицу и увеличивая ответ на единицу. Пока не найдем все 1 или пока не останется 1 элемент. Тогда ответ n. Добавлено через 43 минуты Вот как-то так (надо отладить):
0
|
||||||
|
Вездепух
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
|
||
| 09.05.2024, 19:20 | ||
|
0
|
||
|
6221 / 2919 / 1046
Регистрация: 01.06.2021
Сообщений: 10,810
|
|
| 09.05.2024, 19:27 | |
|
0
|
|
|
Вездепух
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
|
||||||||
| 09.05.2024, 21:10 | ||||||||
|
Что-то вроде
1
|
||||||||
|
0 / 0 / 0
Регистрация: 25.11.2022
Сообщений: 19
|
||||||
| 10.05.2024, 15:25 [ТС] | ||||||
|
Спасибо за идею, а вот эта штука как работает
0
|
||||||
|
6221 / 2919 / 1046
Регистрация: 01.06.2021
Сообщений: 10,810
|
|
| 10.05.2024, 16:47 | |
|
2
|
|
|
0 / 0 / 0
Регистрация: 25.11.2022
Сообщений: 19
|
||||||||
| 11.05.2024, 16:31 [ТС] | ||||||||
Добавлено через 41 минуту
0
|
||||||||
|
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
|
||||||||||||||||
| 11.05.2024, 17:00 | ||||||||||||||||
|
Artem Ka, куча перевыделений памяти и лишних копирований.
Во время инициализации разницу можно находу вычислять и записывать в вектор, а не создавать 2 разных вектора:
a выносите за пределы цикла и резервируете место
0
|
||||||||||||||||
|
Вездепух
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
|
||||||||
| 11.05.2024, 17:04 | ||||||||
assign или swap.
0
|
||||||||
|
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
|
||
| 11.05.2024, 17:23 | ||
|
А при swap+clean у нас остаются те же самые 2 буфера, один из которых можно спокойно заново заполнить.Хотя я сейчас погуглил, resize тоже не удаляет буфер если новый размер меньше текущего, значит можно даже его использовать вместо clean'а, чтобы push_back не проверял каждый раз переполнение текущего буфера.
0
|
||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||
| 11.05.2024, 21:59 | |||
|
Можно избавиться от каунта, запихав, как у меня, флаг "все единицы".
Можно переиспользовать вектор, чтоб не занималась/освобождалась память: Но скорее всего, ожидается алгоритм с меньшей сложностью. Возможно, стоит обратить внимание на факторизующий алгоритм уважаемого TheCalligrapher.
0
|
|||
|
0 / 0 / 0
Регистрация: 25.11.2022
Сообщений: 19
|
|||||||
| 14.05.2024, 18:00 [ТС] | |||||||
5 1 5 2 4 6 выдает 2 1 5 подскажите что к чему?что делать с элементами дальше?
0
|
|||||||
|
Вездепух
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
|
||||||||||||
| 14.05.2024, 20:37 | ||||||||||||
|
Затем через пустую строку дополнительно: делитель, при котором получается одинаковый остаток Затем само братство. По приведенному вам выводу видно, что как ни трудно в это поверить мой код содержит грубую ошибку: он забывает обработать братство, простирающееся до конца последовательности. Также, еще одна ошибка: в строках 89-90 должен использоваться it, а не it_curr.Подправленная версия кода выглядит так
{ 1, 5, 2, 4, 6 } выглядит так
0
|
||||||||||||
| 14.05.2024, 20:37 | |
|
Помогаю со студенческими работами здесь
14
Найти индекс наибольшего числа в массиве Найти в массиве из 5-ти переменных сумму наименьшего и наибольшего элементов Найти все простые числа, оптимизация кода
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|