IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Очередь, Задача с тремя конвейерами
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский

Репутация: -  0  +


Задача такая:

Имеются три конвейера. Конвейеры работают независимо друг от друга. Изначально на первом конвейере располагаются детали N типов, а второй и третий – пусты. Время обработки детали каждого типа с каждого конвейера задается матрицей Time[1..N, 1..3]. После обработки детали с конвейера k она поступает на конвейер k+1. Деталь после третьего конвейера считается изготовленной. Требуется по начальному расположению деталей на первом конвейере определить время, через которое все детали будут изготовлены.

Помогите, пожалуйста, понять хотя бы алгоритм решения: вообще не могу разобраться wacko.gif , где здесь используется очередь и как, собственно, высчитывается само время обработки.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(БелАчкА @ 29.10.2007 21:01) *

не могу разобраться wacko.gif , где здесь используется очередь и как, собственно, высчитывается само время обработки.
Все совсем просто.
Про очереди (они же FIFO) прочитай в FAQ (динамические структуры данных).
Потом делаешь три таких фифы, заполняешь первую деталями и начинаешь перекладывать - во вторую, в третью.. При этом суммируешь время обработки каждой детали на каждом конвеере, взятое из твоей матрицы.

Хорошая задачка. smile.gif
Покажи потом, что получится. Если не получится - спрашивай..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский

Репутация: -  0  +


Что такое "очередь", ее структура и тд... это мне все известно rolleyes.gif У меня проблема в другом: логика не работает lol.gif Я все равно не понимаю как находить время: неужели просто последовательно сложить??? конвейеры же работают одновременно: на одном одна деталь обрабатывается, на другом в это же время - другая... всю голову уже сломала mega_chok.gif Мне почему-то кажется, что время должно как-то по хитрому вычисляться.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


когда-то делал подобную задачу для двух конвееров. время там я считал так
если
Код
a1 a2
b1 b2
c1 c2
заданное время для трех предметов(у меня были банки), то общее время = a1+ max(a2, b1) + max(b2,c1) + c2
но у меня еще было задание найти оптимальный порядок обработки wacko.gif

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(БелАчкА @ 30.10.2007 16:45) *
как находить время: неужели просто последовательно сложить??? конвейеры же работают одновременно: на одном одна деталь обрабатывается, на другом в это же время - другая... всю голову уже сломала mega_chok.gif Мне почему-то кажется, что время должно как-то по хитрому вычисляться.
Нет, конечно не просто сложить.
Нужно моделировать процесс. То есть, например, К1 работает без задержки, а вот К2 может уже простаивать, если К1 еще не выдал ему деталь. compiler дело говорит, вникни.
Я когда-то подробно решал здесь, на Форуме, похожую задачку, про парикмахерскую. Там, правда, совсем от печки.. Только я там не использовал фифы, и "конвеер" там другой smile.gif, но может помочь в понимании. Сейчас поищу.. вот:
Парикмахерская


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский

Репутация: -  0  +


Цитата(Lapp @ 30.10.2007 23:43) *

Нужно моделировать процесс. То есть, например, К1 работает без задержки, а вот К2 может уже простаивать, если К1 еще не выдал ему деталь. compiler дело говорит, вникни.

Вникла... вот только n типов это не 3 банки, а 3 конвейера - не 2 smile.gif Все сложнее.
Для начала решила попытаться найти время обработки для 3 деталей(различных) и 3 конвейеров. Вот что получилось:

//t=array[1..3(детали), 1..3(конвейеры)] of real(время)
T:=0; //общее время обработки
T:=t[1,1]+max(t[1,2],t[2,1]);
if t[1,2]>t[2,1] then T:=T+max(t[3,1]-(t[1,2]-t[2,1]), t[2,2])
else T:=T+max(t[3,1],t[2,2]);
if t[1,3]>t[2,2] then T:=T+max(t[3,2]-(t[1,3]-t[2,2]),t[2,3])
else T:=T+max(t[3,2],t[2,3]);
T:=T+t[3,3];


Не знаю насколько это верно, так как все проделывалось мною на бумажке вручную smile.gif
Надеюсь на Вашу помощь в проверке моей писанины.
If мои расчеты верны (в чем я лично почему-то глубоко сомневаюсь wink.gif ) then можно будет переходить к общей задаче для n типов else mega_chok.gif
!help.gif

Сообщение отредактировано: БелАчкА -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(БелАчкА @ 31.10.2007 17:07) *

mega_chok.gif
А вот этого не надо! держи себя в руках smile.gif
Вот, примерно так можно сделать. Идея простая - модель реальной жизни. Представь себя на заводе - и все получится smile.gif. Все просто, как валенок.
Сама прога небольшая, больше половины занимает реализация Фифо (инициализация, положить, взять).
Если что непонятно - спрашивай.
Могу добавить более подробные комментарии.
{real time multy-line processing model}
{by Lapp for Belachka}

type
tContent=integer;
tpCell=^tCell;
tCell=record
c:tContent;
p:tpCell
end;
tFifo=record
i,o:tpCell
end;

procedure Fifo(var b:tFifo);
begin
b.i:=nil;
b.o:=nil
end;

procedure Put(var b:tFifo; c:tContent);
begin
with b do if i=nil then begin
New(i);
o:=i
end
else begin
New(i^.p);
i:=i^.p;
i^.p:=nil
end;
b.i^.c:=c
end;

function Get(var b:tFifo; var c:tContent):boolean;
var
p:tpCell;
begin
with b do if o=nil then Get:=false
else begin
c:=o^.c;
p:=o^.p;
if o=i then i:=nil;
Dispose(o);
o:=p;
Get:=true
end
end;

const
Mk=10; {максимум конвееров}
Md=100; {максимум деталей}

var
i,j,Nd,Nk,Dd:integer;
T,T1:real; {реальное время}
TDK:array[1..Md,1..Mk]of real; {матрица времен обработки}
Tk:array[1..Mk]of real; {контрольные времена конвееров}
d:array[1..Mk]of integer; {детали в обработке в наст. время}
K:array[1..Mk]of tFifo; {очереди по конвеерам}
f:text;

begin
for i:=1 to Nk do Fifo(K[i]);
Assign(f,'Ford.txt');
Reset(f);
ReadLn(f,Nk);
ReadLn(f,Nd);
for j:=1 to Nd do begin
for i:=1 to Nk do Read(f,TDK[j,i]);
ReadLn(f)
end;
for j:=1 to Nd do begin
Read(f,i);
Put(K[1],i)
end;
Close(f);
T:=0;
for i:=1 to Nk do Tk[i]:=0;
Dd:=0;
repeat
for i:=1 to Nk do begin
if (T=Tk[i]) and (T>0) then if i<Nk then Put(K[i+1],d[i]) else Inc(Dd);
if (T>=Tk[i]) and Get(K[i],d[i]) then Tk[i]:=T+TDK[d[i],i];
end;
for i:=1 to Nk do if T1<Tk[i] then T1:=Tk[i];
for i:=1 to Nk do if (T<Tk[i]) and (Tk[i]<T1) then T1:=Tk[i];
T:=T1
until Dd=Nd;
WriteLn(T)
end.


Добавлено через 7 мин.
Да, забыл сказать про входные данные..
Они берутся из файла Ford.txt smile.gif
Вот его содержимое:
Код
3         number of lines
4         number of details
1 2 3     matrix TDK (time-detail-konv)
2 1 1
5 2 1
2 1 5
1 2 3 4   input line (first number going first)


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский

Репутация: -  0  +


Lapp, большое спасибо! smile.gif

Вопросы, конечно же, есть...
begin
for i:=1 to Nk do Fifo(K[i]); // почему здесь используется переменная Nk, если ее значение еще не считано из файла?
Assign(f,'Ford.txt');
Reset(f);
ReadLn(f,Nk);
ReadLn(f,Nd);
for j:=1 to Nd do begin
for i:=1 to Nk do Read(f,TDK[j,i]);
ReadLn(f)
end;
for j:=1 to Nd do begin
Read(f,i);
Put(K[1],i)
end;
Close(f);
T:=0;
for i:=1 to Nk do Tk[i]:=0;
Dd:=0; //Dd - это количество уже обработанных деталей, так?



И не совсем разобралась в основном цикле, хотелось бы получить комментарии к действиям rolleyes.gif
  repeat
for i:=1 to Nk do begin
if (T=Tk[i]) and (T>0) then if i<Nk then Put(K[i+1],d[i]) else Inc(Dd);
if (T>=Tk[i]) and Get(K[i],d[i]) then Tk[i]:=T+TDK[d[i],i];
end;
for i:=1 to Nk do if T1<Tk[i] then T1:=Tk[i];
for i:=1 to Nk do if (T<Tk[i]) and (Tk[i]<T1) then T1:=Tk[i];
T:=T1
until Dd=Nd;
WriteLn(T)
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата(БелАчкА @ 1.11.2007 17:49) *

Вопросы, конечно же, есть...
begin
for i:=1 to Nk do Fifo(K[i]); // почему здесь используется переменная Nk, если ее значение еще не считано из файла?



По очень простой причине: у меня было 4 часа ночи.. Сначала эта строчка была там, где надо: после прочтения Nk. Но перед самой отсылкой поста мне вдруг стукнуло в голову переставить - чисто конкретно для красоты smile.gif. Спасибо!

Dd (Done detailes) - да, это которые сняты с последнего конвеера. Нужно только для того, чтоб отследить конец процесса.

Хорошо, я прокомментирую чуть подробнее. Не прямо сейчас, но к утру будет smile.gif.

Есть еще одно замечание, вчера (моим вчера) я забыл написать его. В проге используется сравнение действительных чисел, что не вполне корректно и может выйти боком. Надо его заменить на сравнение с погрешностью. Погрешность выбирать достаточно малую по сравнению с характерными временами в системе (времена обработки).

Я это, я.. Лопарь
Извиняюсь - опять забыл войти..


Сообщение отредактировано: Lapp -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


БелАчкА, чтобы лучше разобраться, просто представь себя тем человеком, который следит за конвеерами (я прошу прощения за орфографию, правильно писать "конвейер", но у мя рука не поворачивается такое уродство изображать..) и перекладывает детали с одного К на другой, когда они готовы. Что он делает? Он кладет деталь на конвеер, смотрит в табличку, сколько времени она будет обрабатываться и отмечает это время у себя в блокноте (контрольная точка, КТ). И так с каждым конвеером. Потом идет спать, а будильник заводит на ближайшую КТ.

Дальше зависит от реализации. Если он вместе с КТ отметил и номер конвеера, то он идет прямо к нужному конвееру. Если же он отметил просто время, то он проверяет все конвееры по очереди, начиная с первого, выискивая тот, у которого КТ совпадает с текущим временем. Находит, перекладывает деталь на следующий конвеер (или кладет на склад готовых деталей) и смотрит, есть ди детали в очереди для этого конвеера. Если есть, то загружает его следующей деталью и передвигает его КТ. Так он обходит все К в этот момент, а потом снова идет спать до следующей ТК. Я предпочел второй способ. Первый кажется эффективнее - попробуй его реализовать.

Вот и все smile.gif. Непыльная работенка. А ты у него ее отбираешь, заменяешь машиной... smile.gif

Я добавил наглядный вывод всего процесса с использованием псевдографики. Как только его увидишь, все станет понятно smile.gif. Но при его использовании нужно задавать времена только целыми (я имею в виду, без дробей). Это в принципе не запрещается алгоритмом, но псевдографика не сдюжит..

Еще одно замечание. Эта программа неправильно обрабатывает ситуацию, когда время обработки какой-то детали на одном из конвееров нулевое. Но тут нужно уточнить услови - можно ли сразу перепрыгивать через такой конвеер на следующий (это приведет к изменению порядка следования деталей, что, как мне кажется, не страшно) или нужно все-таки выстоять очередь на нем.

Выкладываю вторую версию smile.gif.
1. Исправлена ошибка, замеченная тобой выше.
2. Выкинута переменная Work (она не нужна, если начальные КТ задать отрицательными).
3. Добавлены комментарии.
4. Добавлена псевдографика, которая наглядно представляет процесс.

Вот, на всякий случай, еще один входной файл, побольше:
Код
5             number of lines
8             number of details
3 2 3 2 1     matrix TDK (time-detail-konv)
2 1 1 3 5
5 2 1 2 1
2 1 5 4 1
5 2 1 3 4
4 1 5 1 1
6 2 1 2 2
8 5 5 4 1
1 2 3 5 8 6 1 7  input line (left to right)

- который выдает такой результат:
Код
T=  47.000
aaabbccccceeeeehhhhhhhhffffaaagggggg
---aab----cc---ee------hhhhhf-aa----gg
-----aaab---c----e----------hhhhhfffffaaag
--------aabbbcc---eee------------hhhh-f--aagg
----------a--bbbbbc--eeee------------h-f---a-gg
- тут четко видно продвижение каждой детали (буква) по конвеерам.

Ну, и сама прога:
//real time multy-line processing model
//by Lapp for Belachka
//Version 2

type
tContent=integer;
tpCell=^tCell;
tCell=record
c:tContent;
p:tpCell
end;
tFifo=record
i,o:tpCell
end;

procedure Fifo(var b:tFifo);
begin
b.i:=nil;
b.o:=nil
end;

procedure Put(var b:tFifo; c:tContent);
begin
with b do if i=nil then begin
New(i);
o:=i
end
else begin
New(i^.p);
i:=i^.p;
i^.p:=nil
end;
b.i^.c:=c
end;

function Get(var b:tFifo; var c:tContent):boolean;
var
p:tpCell;
begin
with b do if o=nil then Get:=false
else begin
c:=o^.c;
p:=o^.p;
if o=i then i:=nil;
Dispose(o);
o:=p;
Get:=true
end
end;

const
Mk=10; //максимум конвееров (К)
Md=28; //максимум деталей
e=1e-5; //погрешность сравнения

var
i,j,Nd,Nk,Dd:integer;
T,T1:real; //реальное время
TDK:array[1..Md,1..Mk]of real; //матрица времен обработки
Tk:array[1..Mk]of real; //контрольные точки (КТ) всех К
d:array[1..Mk]of integer; //детали в обработке в наст. время
K:array[1..Mk]of tFifo; //очереди ожидания К
f:text;

var //переменные для псевдографики
x:integer; //можно убрать их, а потом убрать все строчки,
s:array[1..Mk]of string; //где ругается компилятор


begin
Assign(f,'Ford.txt');
Reset(f);
ReadLn(f,Nk);
for i:=1 to Nk do Fifo(K[i]);
ReadLn(f,Nd);
for j:=1 to Nd do begin
for i:=1 to Nk do Read(f,TDK[j,i]);
ReadLn(f)
end;
for j:=1 to Nd do begin
Read(f,i);
Put(K[1],i)
end;
Close(f);
T:=0; //время начинается с нуля
for i:=1 to Nk do Tk[i]:=-0.1; //все конвееры к началу уже пустые некоторое время
Dd:=0; //обнуляем конечный результат
repeat //вперед по времени по КТ
for i:=1 to Nk do begin //цикл по конвеерам в каждой КТ
//если время совпадает с КТ, значит на этом конвеере
//закончилась обработка текущей детали.
//для всех, кроме последнего, перекладываем деталь в очередь следующего К
//для последнего просто увеличивает Dd
if (Abs(T-Tk[i])<e) then if i<Nk then Put(K[i+1],d[i]) else Inc(Dd);
//если К свободен, взять деталь из очереди (если там есть что-то)
if (T>=Tk[i]-e) and Get(K[i],d[i]) then begin
for x:=Round(Tk[i]) to Round(T)-1 do s[i]:=s[i]+'-'; //псевдографика
//отметить КТ для этого К, как время окончания обработки детали
Tk[i]:=T+TDK[d[i],i];
for x:=1 to Round(TDK[d[i],i]) do s[i]:=s[i]+Char(96+d[i]) //псевдографика
end
end;
//найти максимальную КТ
//это можно заменить просто на T1:=<very_large_value>
for i:=1 to Nk do if T1<Tk[i] then T1:=Tk[i];
//найти минимальную КТ, бОльшую текущего времени (т.е. следующую)
for i:=1 to Nk do if (T<Tk[i]) and (Tk[i]<T1) then T1:=Tk[i];
//продвигаем текущее время вперед
T:=T1
until Dd=Nd; //до тех пор, когда будут обработаны все детали
WriteLn('T=',T:8:3); //вывод полного времени
for x:=1 to Nk do WriteLn(s[x]); //вывод псевдографики
ReadLn
end.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский

Репутация: -  0  +


Цитата
По очень простой причине: у меня было 4 часа ночи..
Ну что же Вы так? huh.gif Конвейеры могли бы и подождать, полноценный сон важнее... blush.gif
Цитата
Первый кажется эффективнее - попробуй его реализовать.
Как только полностью разберусь со вторым, попытаюсь это сделать smile.gif

Lapp, вот за это отдельное огромное спасибо! Правда, очень помогло... yes2.gif
Код
T=  47.000
aaabbccccceeeeehhhhhhhhffffaaagggggg
---aab----cc---ee------hhhhhf-aa----gg
-----aaab---c----e----------hhhhhfffffaaag
--------aabbbcc---eee------------hhhh-f--aagg
----------a--bbbbbc--eeee------------h-f---a-gg


Прогресс на лицо: процентов 90 уже понятно applause.gif. Но есть еще вопросы:

Здесь используются элементы d[i] массива d... но чем он у нас заполнен? он же пустой... или я туплю blink.gif
for i:=1 to Nk do begin      //цикл по конвеерам в каждой КТ
//если время совпадает с КТ, значит на этом конвеере
//закончилась обработка текущей детали.
//для всех, кроме последнего, перекладываем деталь в очередь следующего К
//для последнего просто увеличивает Dd
if (Abs(T-Tk[i])<e) then if i<Nk then Put(K[i+1],d[i]) else Inc(Dd);
//если К свободен, взять деталь из очереди (если там есть что-то)
if (T>=Tk[i]-e) and Get(K[i],d[i]) then begin
for x:=Round(Tk[i]) to Round(T)-1 do s[i]:=s[i]+'-'; //псевдографика
//отметить КТ для этого К, как время окончания обработки детали
Tk[i]:=T+TDK[d[i],i];
for x:=1 to Round(TDK[d[i],i]) do s[i]:=s[i]+Char(96+d[i]) //псевдографика
end
end;


Далее...
  for i:=1 to Nk do if T1<Tk[i] then T1:=Tk[i];
//найти минимальную КТ, бОльшую текущего времени (т.е. следующую)
for i:=1 to Nk do if (T<Tk[i]) and (Tk[i]<T1) then T1:=Tk[i];
//продвигаем текущее время вперед
T:=T1

(?)Переменной T1 не было присвоено начальное значение. Я так понимаю, что если делать таким образом: T1:=<very_large_value>, то этого не требуется. А если как в проге, то возникает (?).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(БелАчкА @ 2.11.2007 15:03) *
Ну что же Вы так? huh.gif Конвейеры могли бы и подождать, полноценный сон важнее...
Такие уж Мы... программеры - что с Нас взять?.. smile.gif

Цитата(БелАчкА @ 2.11.2007 15:03) *
Как только полностью разберусь со вторым, попытаюсь это сделать
Поторапливайся.. Руки-то чешутся! Еле сдерживаюсь.. smile.gif

Цитата(БелАчкА @ 2.11.2007 15:03) *
Здесь используются элементы d[i] массива d... но чем он у нас заполнен? он же пустой... или я туплю
Вот тут мы действительно используем d. Но мы в эту строчку гарантированно не заходим на первом проходе цикла (поскольку Т=0, а Тk<0).
      //если время совпадает с КТ, значит на этом конвеере
//закончилась обработка текущей детали.
//для всех, кроме последнего, перекладываем деталь в очередь следующего К
//для последнего просто увеличивает Dd
if (Abs(T-Tk[i])<e) then if i<Nk then Put(K[i+1],d[i]) else Inc(Dd);

А вот тут мы заполняем массив d (обрати внимание, что второй параметр в Get описан как var):
      //если К свободен, взять деталь из очереди (если там есть что-то)
if (T>=Tk[i]-e) and Get(K[i],d[i]) then begin
И на втором проходе d уже оказывается заполненным (где надо).

Цитата(БелАчкА @ 2.11.2007 15:03) *
(?)Переменной T1 не было присвоено начальное значение. Я так понимаю, что если делать таким образом: T1:=<very_large_value>, то этого не требуется. А если как в проге, то возникает (?).
Не совсем так. Слова "этого не требуется" относятся только к первой строчке из двух. Эта строчка нужна, чтоб положить в Т1 зачение, заведомо не меньшее, чем следующая КТ:
    for i:=1 to Nk do if T1<Tk[i] then T1:=Tk[i];

Теперь смотри: если Т1 было маленьким, то ему присвоится значение. Если оно было большим - то и присваивать не нужно smile.gif. Так что с любым начальным значением Т1 мы получим желаемый результат. А вот вторая строчка выполняет реальную работу: ищет следующую КТ:
    for i:=1 to Nk do if (T<Tk[i]) and (Tk[i]<T1) then T1:=Tk[i];
Ее выкидывать никак нельзя!..
Я понятно ответил?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Женский

Репутация: -  0  +


Про d поняла, про Т1 нет...

Вот место, где впервые встречается Т1:
 for i:=1 to Nk do if T1<Tk[i] then T1:=Tk[i];

С чем мы сравниваем Tk[1], если Т1 не имеет никакого значения???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(БелАчкА @ 3.11.2007 16:00) *

Вот место, где впервые встречается Т1:
 for i:=1 to Nk do if T1<Tk[i] then T1:=Tk[i];

С чем мы сравниваем Tk[1], если Т1 не имеет никакого значения???

С тем, что в нем лежит.
Что в этом такого? Чем это тебе не нравится? Это криминал? Ты сама так делаешь каждый день.
Смотри: ты заходишь в магазин. Тебе нравится норковое манто. Ты вынимаешь кошелек и смотришь, сколько в нем денег. До этого момента ты не знаешь, сколько в нем - ты взяла кошелек утром, выходя из дома, не посмотрев, сколько в нем денег. То есть ты сравниваешь цену манто с пока еще неизвестной величиной!! Но ты всегда можешь ее узнать. Ты открываешь кошелек и считаешь деньги.. Если там больше, чем цена манто - ты его покупаешь. Если нет - идешь домой за деньгами. Главный результат тот, что если денег достаточно, то ходить домой не нужно. Выходит - это действие (сравнение цены с неустановленной величиной) вполне осмыслено!

Ну, если это тебя не убедило - возьми и вставь перед этой строчкой что-нить типа T1:=0 или T1:=-12345.67, или T1:=1e10 ... Это не повредит.

А вообще - ты подходишь к проблеме не с того конца. Ты смотришь, как обычно бывает, а нужно исходить их цели. Какая цель этой строчки? ты можешь ее сформулировать? попробуй. А после этого попробуй придумать, как ты сама бы это сделала.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


blink.gif Что-то вы перемудрили мне кажется ...

проверил на 2-х примерах, предложенных тут lapp'ом, результат совпадает с результатом его программы


const
n = 4;

type
TWorkTimes = array [1..n, 1..3] of Integer;

function Max(const a, b: Integer): Integer;
begin
if a > b then Max := a else Max := b;
end;

function MaxTime(const wt: TWorkTimes; const i, j, k: Integer): Integer;
var
a, b, c: Integer;
begin
if i = 0 then a := 0 else a := wt[i, 1];
if j = 0 then b := 0 else b := wt[j, 2];
if k = 0 then c := 0 else c := wt[k, 3];
MaxTime := Max(Max(a, b), c);
end;

procedure NextTact(var i, j, k: Integer);
begin
k := j;
j := i;
if (i < n) and (i <> 0) then inc(i)
else i := 0;
end;

function GetTotalTime(wt: TWorkTimes; i, j, k: integer): LongInt;
var
time: LongInt;
begin
if (i = 0) and (j = 0) and (k = 0) then
GetTotalTime := 0
else begin
time := MaxTime(wt, i, j, k);
NextTact(i, j, k);
GetTotalTime := time + GetTotalTime(wt, i, j, k);
end;
end;

var

WT: TWorkTimes = (
(1, 2, 3),
(2, 1, 1),
(5, 2, 1),
(2, 1, 5)
);

begin
writeln(GetTotalTime(WT, 1, 0, 0));
end.


Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(klem4 @ 4.11.2007 11:30) *

blink.gif Что-то вы перемудрили мне кажется ...
Может, и так.. но тогда ты явно недомудрил.. smile.gif
klem4, скажи: какую задачу ты вообще решал?.. Что ты считаешь? Где входной поток деталей? Твоя программа телепатически угадывает его? smile.gif

И еще одно: обрати внимание, что в решении требуется присутствие очередей (fifo, насколько я понимаю).

А вообще, использовать тут рекурсию - наверное, неплохая идея.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
какую задачу ты вообще решал?


Сколько времени пройдет до того момента, как последняя деталь пройдет третий конвеер.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


klem4, еще раз прошу тебя ответить на вопрос (извиняюсь за цитирование самого себя):
Цитата(Lapp @ 5.11.2007 5:45) *

Где входной поток деталей?

В файле данных, который используется в моей программе - это последняя строка. Где эти данные в твоей проге?
Извини, я просто не понимаю..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


а это у меня не предусмотрено, то есть всегда поток такой: 1, 2, 3, 4, ..., N
можно сделать в принципе ...


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(klem4 @ 5.11.2007 13:57) *

всегда поток такой: 1, 2, 3, 4, ..., N
Ясно. Но условие гласит, цитирую:
Цитата
Изначально на первом конвейере располагаются детали N типов,
- именно типов, а не N деталей.

И, второе - остается необходимость использовать очереди. Впрочем, автору темы виднее. Но если не так - то зачем же я старался?.. blink.gif

Но рекурсия - это правильно. Добавь ввод потока деталей, введи очереди - и все будет классно! smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 22:21
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name