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

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

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

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

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

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

а можете написать алгоритм Роте просто словами:
шаг 1
шаг 2

А то уже 3 варианта написала
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 12.09.2010, 19:19   #22
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Код:
Ввести n 	# к-во персонажей
Ввести {t[i]}, i = 1..n
Упорядочить t[] по неубыванию времён

пока n >= 4
   t1 := t[1]+2*t[2]+t[n]
   t2 := 2*t[1]+t[n-1]+t[n]
   если t1 < t2 то
      Перевести через мост персонажей №1 и №2
      Вернуться обратно персонажу №1
      Перевести через мост персонажей №(n-1) и №n
      Вернуться обратно персонажу №2
   иначе
      Перевести через мост персонажей №1 и №n
      Вернуться обратно персонажу №1
      Перевести через мост персонажей №1 и №(n-1)
      Вернуться обратно персонажу №1
   всё-если
   n := n-2
всё-пока

если n == 3 то
   Перевести через мост персонажей №1 и №3
   Вернуться обратно персонажу №1
всё-если

Перевести через мост персонажей №1 и №2
Нумерация с единицы, как в Паскале.
Vago вне форума Ответить с цитированием
Старый 12.09.2010, 19:51   #23
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;
	i:integer;
	n:integer;
	sum_1,sum_2:integer;
  f_out:text;
  sum:integer;
  left_min_1,left_min_2,rigth,left_max_1,left_max_2: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;
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 12.09.2010, 19:51   #24
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
//==============================================================================
//      проверка на быстрое решение
//==============================================================================
  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;
//==============================================================================
//      проверяем остался ли кто-нибудь и переводим самого быстрого обратно
//==============================================================================
		  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;
//==============================================================================
//      переводим самого быстрого и медленного
//==============================================================================
      left_min_1:=search_min(1,0);  //самый быстрый
      left_max_1:=search_max(n);  //самый медленный

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

		  writeln(f_out,'>',people[left_min_1].xod,' ',people[left_max_1].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;
      while(cheak()=true) do
      begin
//==============================================================================
//      водим быстрого и медленного
//==============================================================================
        left_min_1:=search_min(1,0);
        left_max_1:=search_max(n);

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

        writeln(f_out,'>',people[left_min_1].xod,' ',people[left_max_1].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;
        break;
      end;
    end;
  end;
  writeln(f_out,'time: ',sum);
  close(f_out);
end.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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