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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2013, 21:52   #1
Klavdia
Новичок
Джуниор
 
Регистрация: 18.04.2012
Сообщений: 2
Восклицание Помогите пожалуйста решить задачу о деревянной рейке и связанных гвоздях

В длинную деревянную рейку вбили несколько гвоздей. Некоторые пары гвоздей связываются верёвочками так, чтобы выполнялись следующие условия:
к каждому гвоздю была привязана хотя бы одна верёвочка;
суммарная длина верёвочек была бы минимальной. Написать программу, которая связывает пары гвоздей верёвочками как описано выше.
Технические требования: Входными данными являются число гвоздей и их координаты, выходными минимальная суммарная длина и пары соединений гвоздей.
Замечание. Задача решается без перебора.
Klavdia вне форума Ответить с цитированием
Старый 13.10.2013, 23:17   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот в этой теме есть решение от BDA на C++
перепишите его на Паскаль и получите нужный код.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.10.2013, 23:34   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Serge_Bliznykov, вот чувствовал, что уже видел эту задачку, а найти не смог
А что решение писал, вообще вылетело из головы
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.10.2013, 07:35   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А задачка-то известная.. и на acmp есть..
Код:
type
        TArr = array [1..100] of Integer;
 
function Min (a, b : Integer) : Integer;
 
begin
        if a < b then
                Min := a
        else
                Min := b
end;
 
procedure Swap (var a, b : Integer);
 
var
        t : Integer;
 
begin
    t := a;
    a := b;
    b := t;
end;
 
procedure SortArr (var a : TArr; const n : Integer);
 
var
        i, j : Integer;
        min : Integer;
 
begin
    for i := 1 to n-1 do begin
        min := i;
        for j := i+1 to n do
            if a[j] < a[min] then
                min := j;
        Swap (a[i], a[min]);
    end;
end;
 
 
var
        a, b : TArr;
        j, n, i, t1, t2, t : Integer;
 
begin
        Assign (input, 'input.txt');
        Reset (input);
 
        Assign (output, 'output.txt');
        Rewrite (output);
        ReadLn (n);
 
        for i := 1 to n do
                Read (a[i]);
 
 
        SortArr (a, n);
 
 
 
        for i := 2 to n do
                b[i-1] := a[i] - a[i-1];
 
 
        b[2] := b[1] + b[2];
 
        for i := 3 to n-1 do
                b[i] := Min (b[i-1], b[i-2]) + b[i];
 
 
        WriteLn (b[n-1])
end.
Poma][a вне форума Ответить с цитированием
Старый 15.10.2013, 00:20   #5
Klavdia
Новичок
Джуниор
 
Регистрация: 18.04.2012
Сообщений: 2
По умолчанию

Спасибо вам! А можно помочь с программой целиком??? Чтобы выполняла оба условия задачи.
Klavdia вне форума Ответить с цитированием
Старый 15.10.2013, 08:57   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Klavdia Посмотреть сообщение
Спасибо вам! А можно помочь с программой целиком??? Чтобы выполняла оба условия задачи.
не хочу Вас расстраивать, но все предложенные варианты решения выполняют ОБА условия задачи: и находят минимальную суммарную длину и делают это БЕЗ ПЕРЕБОРА.

насколько я могу судить, используется т.н. "динамическое программирование".
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.10.2013, 09:07   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Serge_Bliznykov, ТС имеет ввиду неполноту выходных данных.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.10.2013, 12:33   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
не хочу Вас расстраивать, но все предложенные варианты решения выполняют ОБА условия задачи: и находят минимальную суммарную длину и делают это БЕЗ ПЕРЕБОРА.

насколько я могу судить, используется т.н. "динамическое программирование".
Цитата:
Входными данными являются число гвоздей и их координаты, выходными минимальная суммарная длина и пары соединений гвоздей.
Угу.. Не выводит..
Poma][a вне форума Ответить с цитированием
Старый 15.10.2013, 13:30   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
ТС имеет ввиду неполноту выходных данных.
ага. спасибо. тогда согласен, это действительно так, какие пары дают такую длину программа не сообщает...

p.s. это потому что в аналогичной задаче на ACMP требовалось одно число - только минимальная длина нити и ничего более!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.10.2013, 08:15   #10
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

По рейкой понимается "одномерная доска", где гвозди можно вбивать только в ряд?
Зачем нужны тогда координаты?
И если я правильно понимаю, что такое рейка, то, если я не ошибаюсь, то оптимальное решение такое:
если число гвоздей чётное, то 1 соединяется во 2-м, 3 с 4, 5 с 6 и так далее.
Если нечётное, то так же, только предпоследний соединяется ещё и с последним.
Вадим Мошев вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста решить задачу. isyakin Помощь студентам 0 28.09.2013 20:10
Помогите, пожалуйста, решить задачу medved_d Общие вопросы C/C++ 0 28.09.2013 12:16
Помогите решить задачу, пожалуйста! Elizaveta Паскаль, Turbo Pascal, PascalABC.NET 1 10.11.2008 02:29