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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2010, 18:30   #11
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

еще раз спасибо, теперь буду реализовывать
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 04.09.2010, 19:08   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Самое смешное, что чуть ниже в этом самом п.4 приведен пример, когда этот алгоритм оптимального решения не даёт!
Ага. Забавно!
И, что характерно. В качестве оптимального подходит тот алгоритм, который я описывал с самого начала - самый быстрый переводит всех по очереди.
Как вариант можно вычислить время согласно алгоритму два самых быстрых и два самых медленных и сравнить со временем, вычисленным по формуле (мой пост #2) - и выбрать оптимальный из этих двух...
а вообще надо бы почитать алгоритм Роте, надеюсь, что у меня базисных знаний математики хватит, чтобы его понять...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.09.2010, 18:21   #13
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

вот такая программа у меня получилась:
Код:
program bridge;

{$APPTYPE CONSOLE}

uses
  SysUtils;

//==============================================================================
//      описание типов и переменных
//==============================================================================
type
  human = record
    xod:integer;
    status:boolean; //false-не перешел true-перешел
  end;

var
  people:array[1..10] of human;
  left_min_1:integer; //список тех кто ушел направо
  left_min_2:integer; //список тех кто ушел направо
  left_max_1:integer; //список тех кто ушел направо
  left_max_2:integer; //список тех кто ушел направо
  rigth:integer; //список тех кто ушел налево
  i:integer;
  n:integer;
  f_out:text;
  sum:integer;
//==============================================================================
//      процедуры и функции
//==============================================================================
procedure read_data();  //процедура ввода данных
var
  f_in:text;
begin
  assign(f_in,'D:\КМБ\Языки программирования\практика\pascal\bridge\input.txt');
  reset(f_in);
  readln(f_in,n);
  for i:=1 to  n do
  begin
    read(f_in,people[i].xod);
    people[i].status:=false;
  end;
  close(f_in);
end;

function cheak():boolean; //проверка наличия человек на левой стороне true-есть false-нет
var
  j:integer;
  res:boolean;
begin
  res:=false; //изначально думаем что на левом никого нет
  j:=1;
  while((j<=n)and(res=false)) do
  begin
    if(people[j].status=false) then res:=true //находим оставшегося на левом и выходим
    else  inc(j); //ищем дальше
  end;
  cheak:=res;    
end;

function search_min(k:integer;storona:integer):integer;  //поиск самого быстрого (с какого начинаем, какая сторона)
var
  test:boolean;
begin
  test:=false;
  if (storona=0) then //если с левой стороны то проверяем status на false и ++
  begin
    while((test=false)and(k<=n)) do
    begin
      if(people[k].status=false) then test:=true
      else inc(k);
    end;
  end
  else if (storona=1) then //если с правой стороны то проверяем status на true и --
  begin
    while((test=false)and(k<=n)) do
    begin
      if(people[k].status=true) then test:=true
      else inc(k);
    end;
  end;
  search_min:=k;
end;

function search_max(k:integer):integer;  //поиск медленного слева
var
  test:boolean;
begin
  test:=false;
  while((test=false)and(k>=1)) do
    begin
      if(people[k].status=false) then test:=true
      else dec(k);
    end;
  search_max:=k;
end;

//==============================================================================
//      главная программа
//==============================================================================
begin
  read_data();

//==============================================================================
//      подготовка результируещего файла
//==============================================================================
  assign(f_out,'D:\КМБ\Языки программирования\практика\pascal\bridge\output.txt');
  rewrite(f_out);
  sum:=0;
//==============================================================================
//      проверка на быстрое решение
//==============================================================================
  if(n=0) then  //если 0 то выводим сообщение
  begin
    writeln(f_out,'введите n больше 0');
  end
  else if(n=1) then //если 1 то выводим его время
  begin
    people[1].status:=true;
    writeln(f_out,'>',people[1].xod);
    writeln(f_out,'time: ',people[1].xod);
  end
  else //начинаем вычисления
  begin
    while(cheak()=true) do  //если кто-нибудь остался на левом берегу
    begin
//==============================================================================
//      1.берем 2 быстрых переводим на правый берег
//==============================================================================
      left_min_1:=search_min(1,0);  //самый быстрый
      left_min_2:=search_min(left_min_1+1,0); //второй быстрый

      people[left_min_1].status:=true;
      people[left_min_2].status:=true;

      writeln(f_out,'>',people[left_min_1].xod,' ',people[left_min_2].xod);

      sum:=sum+people[left_min_2].xod;
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 05.09.2010, 18:21   #14
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
//==============================================================================
//      проверяем остался ли кто-нибудь и переводим самого быстрого обратно
//==============================================================================
      if (cheak()=false) then break //выходим если никого нет
      else  //возвращаем самого быстрого
      begin
        rigth:=search_min(1,1);  //самый быстрый
        people[rigth].status:=false;
        writeln(f_out,'<',people[rigth].xod);
        sum:=sum+people[rigth].xod;
      end;
//==============================================================================
//      находим 2 медленных и переводим
//==============================================================================
      left_max_1:=search_max(n);  //самый быстрый
      left_max_2:=search_max(left_max_1-1); //второй быстрый

      people[left_max_1].status:=true;
      people[left_max_2].status:=true;

      writeln(f_out,'>',people[left_max_1].xod,' ',people[left_max_2].xod);

      sum:=sum+people[left_max_1].xod;
//==============================================================================
//      проверяем остался ли кто-нибудь и переводим самого быстрого обратно
//==============================================================================
      if (cheak()=false) then break //выходим если никого нет
      else  //возвращаем самого быстрого
      begin
        rigth:=search_min(1,1);  //самый быстрый
        people[rigth].status:=false;
        writeln(f_out,'<',people[rigth].xod);
        sum:=sum+people[rigth].xod;
      end;
    end;
    writeln(f_out,'time: ',sum);
  end;
  close(f_out);
end.
Но вот при входных данных 1 100 100 100 она работает не оптимально, как уж говорилось. Но вот как сделать так чтобы все работало оптимально я не знаю.[/CODE]
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 05.09.2010, 20:23   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Роте ни читали? Вот и уменя тоже руки никак не дойдут...

а если использовать то, что я выше предложил?
Цитата:
Как вариант можно вычислить время согласно алгоритму два самых быстрых и два самых медленных и сравнить со временем, вычисленным по формуле (мой пост #2) - и выбрать оптимальный из этих двух...
т.е. время прохода по одному алгоритму есть. Для второго просто по формуле посчитать. И брать наименьший.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.09.2010, 20:27   #16
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

хм надо попробовать, спасибо
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 06.09.2010, 10:05   #17
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Папа может перейти его за 1 минуту, мама — за 2, сынишка — за 5, а бабушка — за 10 минут. У них есть один фонарик, а мост выдерживает только двоих. За сколько минут все они смогут его перейти при лучшей организации своего движения?
Папа ведет бабулю - 10 мин
Возвращается - 11 мин
Отдает фонарь маме, она и сын переходят - 16
Мама возвращается назад - 18
Ведет папу - 20
Итого 20 минут.

Я не ошибаюсь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.09.2010, 10:53   #18
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Нет, Виталий, не так..
Вы зря не почитали всё обсуждение, которое растянулось на две страницы.

Тот алгоритм, который я предлагал в начале (ошибочно считая, что он даёт всегда оптимальное решение) - один самый быстрый по очереди переводит всех остальных:

(время будут писать сразу итоговое, если Вам так кажется удобнее ):
Папа ведёт маму - 2 мин
Папа возвращается - 3 мин
Папа ведёт сынишку - 8 минут
Папа возвращается - 9 мин
Папа ведёт бабушку - 19 минут

но есть и другой способ (я его условно называю Самые Быстрые + Самые Медленнные)
Папа ведёт маму - 2 мин
Папа возвращается - 3 мин
он отдаёт фонарик Сын и Бабушка идут вместе - 13 минут
Мама возвращается - 15 минут
Папа и мама идут - 17 минут
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2010, 11:16   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
зря не почитали
Ошибаешся. Прочитал, но по формулам не многое понял. Но всетки те 40 и 33 минут многовато, вот и подумал что 20 мин как раз им хватит чтоб успеть к зомбоящику.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.09.2010, 15:29   #20
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Sparky, Вот Вам запрограммированный алгоритм этого самого немца. Паскаля я не знаю, но, думаю, - переведёте. Питон, как и Си, начинает нумерацию эл-тов массива с нуля. Массив времён (t[]) должен быть упорядочен по неубыванию.
Код:
#!/usr/bin/python
# -*- coding: cp1251 -*-

from numpy import array

t = array( [1, 2, 5, 10], dtype = int )
#2 t = array( [1, 2, 10, 10, 15], dtype = int )
#3 t = array( [1, 100, 100, 100], dtype = int )
n = len( t )

tTotal = 0

def PrintTimesAndIncreaseTotal( t0 ):
    global tTotal
    tTotal += t0
    print "t = ", t0, " tTotal = ", tTotal


def Forward( k1, k2 ):
    print "Forward: #%d( %d ) & #%d( %d )" % (k1+1,  t[k1], k2+1, t[k2]),
    PrintTimesAndIncreaseTotal( t[k2] )


def Back( k ):
    print "Back: #%d( %d )" % (k+1, t[k]),
    PrintTimesAndIncreaseTotal( t[k] )


while n >= 4 :
    t1 =   t[0] + 2 * t[1]   + t[n-1]
    t2 = 2*t[0] +     t[n-2] + t[n-1]

    if t1 < t2:
        Forward( 0, 1 )
        Back( 0 )
        Forward( n-2, n-1 )
        Back( 1 )
    else:
        Forward( 0, n-1 )
        Back( 0 )
        Forward( 0, n-2 )
        Back( 0 )

    n -= 2

if n == 3:
    Forward( 0, 2 )
    Back( 0 )

Forward( 0, 1 )

#
Vago вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работает мост между подключениями в Windows? jojahti Свободное общение 2 28.09.2009 14:15
AMD. Северный мост. Охлаждение ПК. Web-Gangsta Компьютерное железо 17 28.07.2009 15:26
Задача про лифт Askar_g Общие вопросы C/C++ 3 05.02.2009 13:01
Задача про функцию dez2007 Помощь студентам 2 03.02.2009 18:46
Задача про 3 прямые meds Паскаль, Turbo Pascal, PascalABC.NET 5 17.11.2008 12:24