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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2011, 07:56   #1
Ainash
 
Регистрация: 04.11.2010
Сообщений: 9
По умолчанию input,output

Приветствую всех!!! Нужна помощь )))
Вложения
Тип файла: doc PASCAL.doc (40.0 Кб, 32 просмотров)
Ainash вне форума Ответить с цитированием
Старый 03.11.2011, 11:04   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Вы бы условия хоть вкратце обозначили. И текст выложили хотя бы в rtf.
Задачи хорошие, добрые. Пятую, похоже, упростили на ходу, а изначально там было что-то вроде поиска пути по графу.
Цитата:
1. "Гвоздики"
На прямой дощечке вбиты гвоздики. Любые два гвоздика можно соединить ниточкой. Требуется соединить какие-то пары гвоздиков ниточками так, чтобы к каждому гвоздику была привязана хотя бы одна ниточка, а суммарная длина всех ниточек была минимальна.
Входные данные. В первой строке входного файла INPUT. IN записано число N – количество гвоздиков (2 ≤ N ≤ 100). В следующей строке записано N чисел -координаты всех гвоздиков (неотрицательные целые числа,не превосходящие 10000).
Выходные данные. В выходной файл OUTPUT. OUT нужно вывести единственное число -минимальную суммарную длину всех ниточек.
Пример входного и выходного файлов:
Код:
INPUT. IN               | OUTPUT. OUT
5                       |
4   10    0    12    2  |  6
Первое действие: прочитать координаты и упорядочить их по возрастанию.
Второе действие: гм... наверное, имеет смысл начать с левого гвоздика. Он соединяется однозначно. Но вот третий слева гвоздик, как мы видим в примере, можно привязывать как к левому, так и к правому.
Базовая идея: если мы в какой-то момент привязали все гвоздики до n-ного одним и другим способом, то для дальнейшей привязки нам нужно из этих способов выбрать тот, где суммарная длина ниток минимальна (как в этой статье, например). Но вот по дороге нам придётся анализировать разные варианты, составляя из них список.

Какие мысли и/или код есть у Вас?
Abstraction вне форума Ответить с цитированием
Старый 03.11.2011, 14:32   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Связать попарно максимально приближенные гвоздики. Если их количество нечетное, найти ближайший к нему. Нам же не обязательно иметь непрерывную нить.
puporev вне форума Ответить с цитированием
Старый 03.11.2011, 14:41   #4
lex_kz
Новичок
Джуниор
 
Регистрация: 03.11.2011
Сообщений: 1
По умолчанию

Всем привет у меня такая же проблема!! Вообщем это задачки с олимпиады школьной,нужно до завтра решить,а я в Паскале не тудым и не сюдым,как говорится.Занимался только pawn скриптингом в gta а вот паскаль могу только по примеру листинга делать..помогите пожалуйста,ребят очень прошу...у меня всего 3 задачи,вот они
Вложения
Тип файла: doc PASCAL.doc (8.9 Кб, 17 просмотров)
lex_kz вне форума Ответить с цитированием
Старый 03.11.2011, 14:47   #5
Ainash
 
Регистрация: 04.11.2010
Сообщений: 9
По умолчанию

да, конечно

Последний раз редактировалось Ainash; 04.11.2011 в 07:52.
Ainash вне форума Ответить с цитированием
Старый 03.11.2011, 15:46   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Puporev
Связать попарно максимально приближенные гвоздики. Если их количество нечетное, найти ближайший к нему. Нам же не обязательно иметь непрерывную нить.
не, имхо не всё так просто...

Перво-напервно, крайние гвоздики должны быть соединены вне зависимости от длины.
т.е. после сортировки по координатам. 1-й гвоздик соединить со 2-м.
а N-й - соединить с n-1
это как бы очевидно... (ну или мне кажется, что это очевидно...)

а вот как дальше среди оставшихся "непривязанными" уже искать миниальное расстояния и привязывать - я, например, лично, в небольшом затруднении..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.11.2011, 02:41   #7
Костя КС
Пользователь
 
Аватар для Костя КС
 
Регистрация: 22.01.2008
Сообщений: 78
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
крайние гвоздики должны быть соединены вне зависимости от длины.
Всего соединений будет :
если гвоздиков четное число, то abs(n/2)+1
если гвоздиков нечетное число, то abs(n/2).

Т. к. мы всегда будем соединять 1ый со 2ым и Nый c (N-1)ым, то остается подсчитать разницы в координатах между каждыми гвоздиками от 2го до (N-1)ого и выбрать из них минимальные.

Например, если у нас 5 гвоздиков, то всего соединений 3. соединив 1 и 2, 4 и 5, останется выбрать одно минимальное между 2-3-4.
Костя КС вне форума Ответить с цитированием
Старый 04.11.2011, 09:27   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
если гвоздиков четное число, то abs(n/2)+1
...
соединив 1 и 2, 4 и 5, останется выбрать одно минимальное между 2-3-4.
Вот я и пытаюсь донести, что соединений может быть как N/2 так и (N div 2)+1.. (кстати, зачем у Вас в формуле модуль? abs() ? )

Давай-те рассмотрим несколько простых конкретных вариантов, когда число гвоздиков чётное и равно 6.
1
Возьмём 6 гвоздиков с координатами: 1 2 4 7 9 10 очевидно, что минимальное потребуется 3 ниточки общей длиной 5

2
Возьмём 6 гвоздиков с координатами: 1 2 4 8 10 11 очевидно, что минимальное потребуется 4(или 3) ниточки общей длиной 6

3
Возьмём 6 гвоздиков с координатами: 1 2 4 9 11 12 очевидно, что минимальное потребуется 4 ниточки общей длиной 6

p.s. т.к. N по условию задачи меньше или равно 100, а соединять ниточками надо всегда ближние гвоздики, то, имхо, нет никаких проблем в написании полного перебора... Это точно даст наименьшую суммарную длину соединений, но, скорее всего (я даже почти уверен в этом) даст неоптимальную вычислительную загрузку..
Имхо, правильный ответ крутится где-то вокруг выбора минимальных расстояний.. Или динамического программирования...

Последний раз редактировалось Serge_Bliznykov; 04.11.2011 в 09:30.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.11.2011, 13:56   #9
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Тут действительно не всё так просто. (Я и сам изначально думал про полный перебор или про метод ветвей и границ)
Например для 12 гвоздиков с кординатами
1 2 3 4 5 6 7 8 9 10 11 12 оптимальным будет
1-2 3-4 5-6 7-8 9-10 11-12
(6 ниточек общей длинной 6)
Но если задать другие кординаты
1 2 3 10 11 12 20 21 22 30 31 32
1-2-3 10-11-12 20-21-22 30-31-32
(8 ниточек общей длинной 8)



Теперь начну рассуждения. (везде в дальнейшем буду рассмтривать кординаты гвоздиков упорядоченные в возрастающем порядке)
Оптимальное соеденение гвоздиков будет состоять из групп по 2 или по 3 гвоздика подрят (группы несвязанны между собой)
(если кому-то очень, очень, очень нужно доказательство то могу его написать, но поверьте на слово любое другое соединение гвоздиков можно разбить на группы по 2 или 3 соединенных гвоздика при этом уменьшив длину необходимой нити)
Тогда можно сказать что оптимальным решением будет некоторый набор из групп по 2 или 3 связанных вместе гвоздиков. Где сумма гвоздиков равна количеству гвоздиков в доске. Причём нужно выбрать группы так чтобы сумма длин всех нитей была минимальной.
Нарисуем граф. Каждый узел будет обозначать, сколько гвоздиков уже связанно (см. рисунок)
Красным цветом нарисованы ребра для соеденения 2 гвоздиков. Зелёным цветом – для 3 гвоздиков.
(узел 1 нарисован серым т.к. 1 гвоздик соединить невозможно)
Теперь это уже простейшая задача на нахождения минимального пути на графе из узла 0 в последний узел (на рисунке узел 9).
В вкратце опишу своими словами алгоритм поиска (есть куча различных описаний в разных книгах).
Будем проходить по очереди, по всем узлам начиная от 0. Для каждого узла будет записывать минимальный путь (минимальную необходимую длину нити). Т.е. берём минимальный (уже записанный) путь для каждого из предыдущего узла связанного с данным 1 ребром прибавляем путь, добавляемый каждым ребром, выбираем из них минимальный и записываем его для текущего узла. И.т.д. для каждого узла пока не будет достигнут последний узел. Путь, записанный для него и будет решением данной задачи.

Реализация.
Обозначил X[1]..X[n] координаты гвоздиков отсортированные по возрастанию.
L[0]..L[n] минимальная необходимая длинна нити.
Тогда L[0]=0 L[1]=неопределенно (можно задать равным бесконечности)
L[2]=L[0]+X[2]-X[1]=X[2]-X[1] L[3]=L[0]+X[3]-X[2]+X[2]-X[1]=X[3]-X[1] L[4]=L[2]+X[4]-X[3]
А дальше L[i]=min(L[i-3]+X[i]-X[i-2],L[i-2]+X[i]-X[i-1])
Когда дойдём до L[n] это и будет решением.
В принципе можно несоздаваь весь массив L[0]..L[n] а хранить только последнии 3 числа (т.е. использовать только 3 переменные вместо массива L). Но это уже сами.
Изображения
Тип файла: jpg 122.JPG (33.8 Кб, 151 просмотров)
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 04.11.2011 в 14:27.
val_nnm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
назначение Input и Output в Pascal sendruck Паскаль, Turbo Pascal, PascalABC.NET 5 18.07.2011 15:03
Длинны векторов, input output everliving Общие вопросы C/C++ 0 26.12.2010 20:05
Вставьте в прогу одномерный массив(функции input и output) Новичек_Rudik Помощь студентам 2 21.04.2010 10:46
BIOS (basic input/output system) Kurmangazi Операционные системы общие вопросы 3 24.09.2009 08:37
INSERT c OUTPUT Veroonya SQL, базы данных 3 23.09.2009 11:38