На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Динамическое программирование , гвозди
    На прямой дощечке вбиты гвоздики. Любые два гвоздика можно соединить ниточкой. Требуется соединить какие-то пары гвоздиков ниточками так, чтобы к каждому гвоздику была привязана хотя бы одна ниточка, а суммарная длина всех ниточек была минимальна.
    Формат входных данных:
    В первой строке входного файла записано число N - количество гвоздиков (1 N 100). В следующей строке записано
    N чисел - координаты всех гвоздиков (неотрицательные целые числа, не превосходящие 10000).
    В выходной файл нужно вывести единственное число - минимальную суммарную длину всех ниточек.
    Помогите, пожалуйста
      ExpandedWrap disabled
        function min(a,b:integer):integer;
        begin
          if a<b then min := a
          else min := b;
        end;
         
        procedure Swap(var a,b:integer);
        var
          q:integer;
        begin
          q := a;
          a := b;
          b := q;
        end;
         
        var
          n,i,j:integer;
          a,b:array[-1..100] of integer;
        begin
          assign(input,'input.txt'); reset(input);
          assign(output,'output.txt'); rewrite(output);
          Read(n);
          for i := 1 to n do Read(a[i]);
          for i := 1 to n do
            for j := i+1 to n do
              if a[i]>a[j] then Swap(a[i],a[j]);
          a[0] := Maxint;
          a[-1] := 0;
          for i := 1 to n do
            b[i] := min(b[i-1],b[i-2])+abs(a[i]-a[i-1]);
          WriteLn(b[n]);
          close(input); close(output);
        end.
        Arsuit
        Спасибо :D . Суперски помог.
          Arsuit
          Спасибо еще раз. Забыл войти
            Цитата Arsuit @
            ExpandedWrap disabled
              function min(a,b:integer):integer;
              begin
                if a<b then min := a
                else min := b;
              end;
               
              procedure Swap(var a,b:integer);
              var
                q:integer;
              begin
                q := a;
                a := b;
                b := q;
              end;
               
              var
                n,i,j:integer;
                a,b:array[-1..100] of integer;
              begin
                assign(input,'input.txt'); reset(input);
                assign(output,'output.txt'); rewrite(output);
                Read(n);
                for i := 1 to n do Read(a[i]);
                for i := 1 to n do
                  for j := i+1 to n do
                    if a[i]>a[j] then Swap(a[i],a[j]);
                a[0] := Maxint;
                a[-1] := 0;
                for i := 1 to n do
                  b[i] := min(b[i-1],b[i-2])+abs(a[i]-a[i-1]);
                WriteLn(b[n]);
                close(input); close(output);
              end.

            к сожелению я не компилятор и ваш код не понял.

            Не могли бы вы описать алгоритм, дать док-во правильности его работы. И привести оценку временной сложности.
              DistMaster

              Я опять не понял твое задание :) Если гвоздики расположены на прямой, то длинна всех ниточек будет минимальна если соеденять только сосение гвоздики? Или я не прав? В чем проблема?

              Цитата DistMaster @
              Требуется соединить какие-то пары гвоздиков ниточками


              Цитата DistMaster @
              так, чтобы к каждому гвоздику была привязана хотя бы одна ниточка


              А если я свяжу какую-то рядом стоящую пару гвоздиков ниточками, а к остальным привяжу оооооочень маленькие ниточки, условие задачи будет выполнено?
              Сообщение отредактировано: Maks1986 -
                Maks1986
                Ну, во-первых, расстояние между гвоздями разное.
                Например
                координаты гвоздей
                1 3 4 7 8 10 12
                А вот ответ
                1-3-4 7-8 10-12
                4 гвоздь не нужно соединять с 7, 8 - с 10
                Не знаю, доступно ли я объяснил, но я тоже не совсем понял чего ты не понял :huh:
                  DistMaster
                  Тогда, если я тебя правильно понял и нигде не прогнал, то это будет выглядеть примерно так:

                  ExpandedWrap disabled
                    begin
                     
                    {загоняешь координыти в массив и сортируешь его}
                     
                    sum:=(a[2]-a[1])+(a[n]-a[n-1]);
                    i:=3;
                    while i<(n-1) do
                       if (a[i]-a[i-1])<(a[i+1]-a[i]) then
                                  begin
                                  sum:=sum+(a[i]-a[i-1]);
                                  i:=i+1;
                                  end
                                         else
                                         begin
                                         sum:=sum+(a[i+1]-a[i]);
                                         i:=i+2;
                                         end;
                    end.
                    Maks1986
                    Ну вроде, да. Хотя не знаю, надо проверить. А что выше указанный код тебя не устроил? Решил сам. Предыдущий код точно верен. Но все-равно Спасибо! :)
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0265 ]   [ 15 queries used ]   [ Generated: 20.06.25, 09:08 GMT ]