Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2008, 13:21   #1
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию Арифметическая прогрессия

Я уже приводил эту задачу, но в другом разделе:

Последовательность S состоит из N элементов S[i], пронумерованных от 1 до N. Из этой последовательности необходимо выбрать максимальное количество различных элементов, являющихся последовательными членами некоторой возрастающей арифметической прогрессии. Порядок этих элементов в последовательности S не имеет значения.

Первая строка содержит целое число N (2<=N<=10000). Вторая строка содержит N целых чисел S[i] (1<=S[i]<=1000000000).

В первую строку вывести максимальное количество элементов. Во вторую строку вывести через пробел и в любом порядке номера этих элементов в последовательности S. Если задача имеет несколько решений, то вывести любое из них.

Лимит времени: 1 с.
Лимит памяти: 4 Мб.

ЗЫ Народ. Не подскажете идею решения. Запрограммировать я и сам смогу.
Carbon вне форума Ответить с цитированием
Старый 09.03.2008, 16:28   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Как вариант можно
1. организовать массив А из записей
а) коэфф. прогрессии
б) массив/список индексов/элементов исходного массива
в) следующее подходящее для данной прогрессии число

2. Пройтись по заданной строке в поисках элементов, удовлетворяющих условию А.[в)], в случае обнаружения соответственно менять элементы А.[в)] и А.[б)] Самая грубая сложность будет в районе (4998 * 10000) сравнений, можно, конечно оптимизировать, скажем, исходя из того, что в массиве А элементы строго упорядочены.
B_N вне форума Ответить с цитированием
Старый 09.03.2008, 16:48   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

А это случайно не O(N^3)?
Carbon вне форума Ответить с цитированием
Старый 09.03.2008, 16:53   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
А это случайно не O(N^3)?
С какой стати? нам надо максимум сравнить N элементов входных данных с N/2 элементами, которые мы сами готовим.
B_N вне форума Ответить с цитированием
Старый 09.03.2008, 16:54   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А сама последовательность никак не задана ?
Например, если отсортированная последовательность

1 2 3 5 7 9 13 17

то арифметическими прогрессиями могут быть:

1 2 3
1 3 5 7 9
1 5 9 13 17

Может так попробовать:

Последовательность отсортировать и найти разность между элементами:

1 1 2 2 2 4 4

Арифметическая последовательность заканчивается (и слева и справа) там, где разность становится больше. Если разность становится
меньше, то заканчивается там, где последовательная сумма разностей больше текущей.
alexBlack вне форума Ответить с цитированием
Старый 09.03.2008, 17:01   #6
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
А сама последовательность никак не задана ?
Например, если отсортированная последовательность

1 2 3 5 7 9 13 17

то арифметическими прогрессиями могут быть:

1 2 3
1 3 5 7 9
1 5 9 13 17

Может так попробовать:

Последовательность отсортировать и найти разность между элементами:

1 1 2 2 2 4 4

Арифметическая последовательность заканчивается (и слева и справа) там, где разность становится больше. Если разность становится
меньше, то заканчивается там, где последовательная сумма разностей больше текущей.
Да последовательность может быть хоть отсортированнной. Проблема в том, что чтобы идти по прогрессии, нужно знать разность. Их O(N^2). Плюс ещё для каждой разности идём по массиву. Вот и O(N^3).
Carbon вне форума Ответить с цитированием
Старый 09.03.2008, 17:03   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
А сама последовательность никак не задана ?
Как я понял, нужно вывести все возможные последовательности.
B_N вне форума Ответить с цитированием
Старый 09.03.2008, 17:05   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Carbon, мы ОДИН раз проходим по входным данным. Плюс ко всему, если натыкаемся, например, на число 10, можем не проверять массив А для коэффициентов, больших пяти.
B_N вне форума Ответить с цитированием
Старый 09.03.2008, 17:05   #9
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
а) коэфф. прогрессии
Все коэффициенты? Их O(N^2).
Carbon вне форума Ответить с цитированием
Старый 09.03.2008, 17:07   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Все коэффициенты? Их O(N^2).
Их N/2. Прогрессия же арифметическая.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц