|
|
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Попалась интересная задачка с codility, никак не могу придумать алгоритм, помогите: A non-empty zero-indexed array A of N integers is given. A pair of integers (P, Q), such that 0 ≤ P ≤ Q < N, is called a slice of array A. Модератор: текст задачи удален по требованию codility under DMCA ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2015, 12:26 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
У меня такие мысли: 1. Сначала находим суммы всех последовательностей (слайсов) A(0...N), A(1...N), A(2...N), A(3...N) 2. Сортируем суммы, при этом индексы начальных элементов храним вместе с суммами. 3. Находим минимальный элемент по модулю внутри отсортированного массива. 4. Теперь организуем цикл от оригинального последнего элемента до первого (from A[N] to A[0]) В этом цикле отнимаем (реально не отнимаем, а только сравниваем) текущий элемент от локального минимума и проверяем снова на локальный минимум. Т.е. ищем локальный элемент, как будто все элементы уменьшены на текущий элемент внутри региона с локальным минимумом, который нашли на предыдущем шаге. Проблема в том, что на каждой итерации мы должны выкидывать из рассмотрения элементы отсортированного массива, которые по длине уже стали 0. Их лучше удалять, поэтому для хранения сортированного массива лучше использовать связанный список. Как только находим сумму равную 0, сразу прекращаем поиск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2015, 12:32 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
herohero18121. Сначала находим суммы всех последовательностей (слайсов) A(0...N), A(1...N), A(2...N), A(3...N) 2. Сортируем суммы, при этом индексы начальных элементов храним вместе с суммами. 3. Находим минимальный элемент по модулю внутри отсортированного массива. Зачем так сложно? Все суммы хранить не надо. Алгоритм поиска минимального значения в массиве знаешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2015, 12:38 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Начни с простого перебора всех возможных комбинаций. Сделаешь - потом будешь совершенствовать алгоритм. Всего комбинаций N*(N-1)/2, т.е. перебор будет дольше чем O(N*log(N)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2015, 12:48 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Заводим переменную для текущего минимума, присваиваем ей min = A[1]. Идём по массиву и набираем вектор сумм summ(1,K). На каждом шаге считаем все возможные суммы summ(M,K) = summ(1,K) - summ(1, M-1), если очередная сумма меньше min, переприсваиваем её. Для оптимизации считаем только те разности, где они одного знака. Если текущий минимум = 0, сразу останавливаемся, иначе считаем до конца и выводим минимум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2015, 13:44 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
Не пойдет. Сложность квадратичная. Нужна N*log(N) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2015, 13:48 |
|
||
|
Помогите придумать алгоритм
|
|||
|---|---|---|---|
|
#18+
herohero1812У меня такие мысли: 1. Сначала находим суммы всех последовательностей (слайсов) A(0...N), A(1...N), A(2...N), A(3...N) 2. Сортируем суммы... ... 3. Находим минимальную разность между парой соседних элементов отсортированного массива :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2015, 14:33 |
|
||
|
|

start [/forum/topic.php?fid=16&tid=1341111]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 249ms |
| total: | 379ms |

| 0 / 0 |
