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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2012, 21:54   #1
Маленыч
Пользователь
 
Аватар для Маленыч
 
Регистрация: 04.04.2012
Сообщений: 23
Восклицание Необходимо составить алгоритм решения задачи с одномерным массивом олимпиадного характера

Задача следующая:

В масcиве А размера N за один просмотр необходимо каждый элемент заменить на ближайший следующий за ним элемент, который больше его. Если такого элемента нет, то заменить его на ноль. Можно использовать дополнительную память.

Помогите составить алгоритм, всмысле помогите мне связными приложениями, либо своими рассуждениями и предположениями по разработке данной программы =)
А я уж как-нибудь сам набросаю =)
Маленыч вне форума Ответить с цитированием
Старый 16.05.2012, 22:22   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А откуда задача?
Как-то не принято на форумах обсуждать задачи не закончившихся олимпиад. А по окончании обычно решения становятся доступными.
s-andriano вне форума Ответить с цитированием
Старый 17.05.2012, 17:55   #3
Маленыч
Пользователь
 
Аватар для Маленыч
 
Регистрация: 04.04.2012
Сообщений: 23
По умолчанию

Задача из моей курсовой. Просто олимпиадного уровня. Я тупо не могу понять, зачем в курсовой давать олимпиадную задачу.
Хотя она не кажется какой-то сложной, но помойму, тут есть подвох.
Маленыч вне форума Ответить с цитированием
Старый 17.05.2012, 23:17   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Я, честно говоря, не вижу ни "олимпиадности", ни подвоха.

Обычно "олимпиадность" подразумевает либо неординарное решение, либо то, что наиболее очевидное решение оказывается неэффективным (например, не укладывается в заданное время).
Здесь же - простой логический путь без вариантов ветвления.

Последний раз редактировалось s-andriano; 18.05.2012 в 07:55.
s-andriano вне форума Ответить с цитированием
Старый 23.05.2012, 20:24   #5
Маленыч
Пользователь
 
Аватар для Маленыч
 
Регистрация: 04.04.2012
Сообщений: 23
По умолчанию

Короче я что-то не пойму, как можно это сделать за один проход?
Маленыч вне форума Ответить с цитированием
Старый 23.05.2012, 20:43   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Просто олимпиадного уровня.
Хм? Что-то? Вот тут есть задачи с контестов и олимпиад, сравните со своей "олимпиадной".
Цитата:
Короче я что-то не пойму, как можно это сделать за один проход?
Сложность алгоритма, если я правильно понимаю, здесь будет O(N^2), в общем, цикл в цикле будет.
_-Re@l-_ вне форума Ответить с цитированием
Старый 23.05.2012, 21:22   #7
Маленыч
Пользователь
 
Аватар для Маленыч
 
Регистрация: 04.04.2012
Сообщений: 23
По умолчанию

Но цикл в цикле это уже n*m проходов
Маленыч вне форума Ответить с цитированием
Старый 23.05.2012, 21:26   #8
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Тырк
Цитата:
Все бы хорошо, только не брики не екситы низя(((
там их как бы и нет
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 24.05.2012 в 04:33.
Mad_Cat вне форума Ответить с цитированием
Старый 23.05.2012, 23:48   #9
Маленыч
Пользователь
 
Аватар для Маленыч
 
Регистрация: 04.04.2012
Сообщений: 23
По умолчанию

Все бы хорошо, только не брики не екситы низя(((
Маленыч вне форума Ответить с цитированием
Старый 24.05.2012, 18:47   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Элементарная логика:
1. Раз элемент нужно менять на следующий, значит, просматривать массив с начала бесполезно - мы не будем иметь ни какого представления ни об одном из следующих элементов. Следовательно, просматриваем массив с конца.
2. Последний элемент, очевидно, заменяем на 0, но предварительно запоминаем его. Т.к. по условию разрешено использовать дополнительную память - используем ее для хранения некоторой информации о "следующих элементах". Создаем стек.
3. Т.к. нам нужны только "бОльшие" эдементы, формируем в стеке убывающую последовательность: если текущий элемент меньше вершины стека, заменяем его на эту вершину, после чего вершину возвращаем в стек и туда же записываем новый элемент из массива. Если элемент больше вершины стека, опустошаем стек до тех пор, пока вершина стека не окажется больше (ну, либо стек не закончится).

Все совершенно элементарно. Сложность O(n), все - за один проход, как и требуется. Тут половина решения уже содержится в условии, а вторая половина восстанавливается при помощи нехитрой логики.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм решения задачи Amet13 Помощь студентам 1 21.04.2012 13:16
Составить алгоритм (блок-схема) и написать программу для решения задачи(Pascal) sadim Помощь студентам 2 18.12.2011 14:53
Разработать алгоритм и составить программу для решения задачи. Длину последовательности задать димон4ик_ Помощь студентам 0 18.10.2011 10:55
Разработать алгоритм и составить программу для решения задачи. Длину последовательности задать димон4ик_ Помощь студентам 2 18.10.2011 09:39
составить алгоритм решения, реализующий перевод из 10 системы счисления в троичную Машута Паскаль, Turbo Pascal, PascalABC.NET 2 09.12.2008 18:20