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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2017, 13:21   #1
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию Совиная почта

Здравствуйте
Нужна помощь в задании
Учитель послал k-тому ученику сову с домашним заданием
Ученик должен разослать сов своим друзьям, те - своим друзьям
Учитель также дал время на решение этого задания
Нужно узнать, сколько времени на решение задания останется у последнего ученика
Дан файл
В первой строке 3 числа - k, N, M
k - ученик, которому учитель отправил задание
N - кол-во учеников
M - время, которое учитель дал на задание
Потом N строк, в каждой по три числа - U, V, T
U, V - номера учеников, которые дружат
T - время, за которое сова доставит письмо от U до V
Пример
1 3 5
1 2 1
1 3 4
2 3 2
Первый ученик получил письмо за 0 (так в любом случае, если ему отправили первому)
Потом первый отправил второму за 1 минуту(значит время у второго:0 + 1 = 1)
Потом первый отправил третьему за 4 минуты(у третьего: 0 + 4 = 4)
Но
Потом идет строка 2 3 2
То есть второй отправил третьему за 2
Значит время второго + это время
1 + 2 = 3
И первый, и второй ученик отправили третьему письмо
Но письмо второго дошло быстрее, значит, нужно ориентироваться по этому времени(более быстром)
Ответ
5 - 3 = 2
(5 - время, которое дал учитель, а 3 - это время, за которое доставили последнему(оно самое большое))
Если хоть одному ученику не доставили письмо, вывести -1.
Как решать, подскажите?
Код:
type ank=record
fr,t,nom,tl:integer;    //nom - номер ученика, который отправляет письмо| fr - номер ученика, который его получает | t - время, за которое nom пришлет fr | tl - время, за которое i-тому ученику доставили письмо | b - доставили письмо i-тому ученику или нет
b:boolean; 
end;
var
a:array[1..1000] of ank;
c:array[1..1000] of integer;
i,k,ch,j:integer;
n,obt,f,vrt,pr,max,dv:integer;
fi,fo:text;
begin
Assign(fi,'D:\owls.txt');
Assign(fo,'D:\owls12.txt');
Reset(fi);
Rewrite(fo);
Read(fi,f,n,obt);
for i:=1 to n do
begin
  Readln(fi);
  Read(fi,a[i].nom,a[i].fr,a[i].t);
end;        // чтение файла 
for i:=1 to n do
  a[i].b:=false;   //никому не доставили, пока что
a[f].b:=true;  //первому доставили
a[f].tl:=0;    //его время - 0
ch:=0;
for i:=1 to n do
  for j:=1 to n do
    if a[a[j].nom].b=true then   //если ученику, который должен отправлять письмо, письмо уже доставили, то
    begin
       if (a[a[j].fr].tl>0)and((a[a[j].nom].tl+a[j].t)<a[a[j].fr].tl) then    
      a[a[j].fr].tl:=a[a[j].nom].tl+a[j].t      //если ему уже отправляли письмо, но на этом раз время меньше, то присваиваем меньшее время
      else if a[a[j].fr].tl=0 then  a[a[j].fr].tl:=a[a[j].nom].tl+a[j].t; //а если ему присылают первый раз, то присваиваем время, за которое доставили
      inc(ch);  
      c[ch]:=a[j].nom;
      a[j].b:=false;  //записываем, что j-тому ученику "не доставили" (дабы цикл опять не пошел по нему)
      a[a[j].fr].b:=true;  //записываем, что nom доставил письмо fr
      break; 
    end;
for i:=1 to ch do
begin
  dv:=c[i];
  a[dv].b:=true;
end;  //возвращаем всем тем. кто получал письмо, что они его получили
for i:=1 to n do
  if a[i].b=false then
  begin
    Write(fo,-1);
    Close(fo);
    exit;
  end; //если хоть кто-то не получил, то выводим -1 и выходим
max:=a[1].tl;
for i:=1 to n do
  if a[i].tl>max then max:=a[i].tl;  //находим максимальное время
Write(fo,obt-max); //выводим время, которое осталось у последнего на решение
Close(fo);
end.
В чем ошибка кода?
Просто неправильные ответы.

Последний раз редактировалось dimon_snake; 12.01.2017 в 13:38.
dimon_snake вне форума Ответить с цитированием
Старый 12.01.2017, 18:24   #2
Dekay
Пользователь
 
Регистрация: 21.06.2016
Сообщений: 65
По умолчанию

Это ужасно.
Единственный вариант, который я могу предположить, - у Вас граф ориентированный, а должен, вроде как, быть не.
А читать такой код - не уважать себя.
Да и решение тоже так себе. Поэтому пардон, но разбираться в этом - я пас.
Dekay вне форума Ответить с цитированием
Старый 13.01.2017, 13:12   #3
AnryKZKZ
Пользователь
 
Регистрация: 15.04.2014
Сообщений: 62
По умолчанию

Да, читать полный код, еще с не совсем полными комментами - очень тяжко.
Как вариант - сначала разложите программу на бумаге, потом попробуйте сами пройти программу по шагам, отмечая в таблице на листочке что получилось и сравнивайте как должно быть. Согласен что тяжкий вариант, но так вы сами найдете ошибку. И быть может созреете для более краткого решения программы.
AnryKZKZ вне форума Ответить с цитированием
Старый 13.01.2017, 13:42   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

там "всего" две ошибки и обе АЛГОРИТМИЧЕСКИЕ.
Цитата:
Код:
fr,t,nom,tl:integer;    //nom - номер ученика, который отправляет письмо| fr - номер ученика, который его получает |
Цитата:
U, V - номера учеников, которые дружат
Отправлять письмо может не только первый номер(U), но и второй(V) тоже.

Цитата:
Код:
if a[a[j].nom].b=true
a[j] относится НЕ к j-ому ученику, а к ДВУМ совершенно другим a[j].U и a[j].V (в обозначениях из УСЛОВИЯ)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почта anat_x Помощь студентам 1 12.11.2013 11:09
почта spydark91 Общие вопросы Delphi 3 25.07.2011 19:15
Почта.... Hausedark Общие вопросы Delphi 9 09.07.2010 17:00
почта xakkkkker Работа с сетью в Delphi 1 20.11.2008 14:52
Почта dmitrymoskva Общие вопросы Delphi 8 05.12.2007 13:00