Показать сообщение отдельно
Старый 22.10.2011, 17:34   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Прежде всего - у нас не принято цепляться к чужим темам, поэтому Ваш запрос выделен в отдельную тему.
Теперь по задаче. Ниже - одно из возможных решений. Суть алгоритма:
Начала и окончания дежурств сторожей переведены в формат абсолютных минут, начиная с полуночи. Далее построен цикл по всем минутам в сутках (их 1440), который прерывается, если текущей минуте не соответствует вахта ни одного из сторожей, либо по исчерпании полного количества минут в сутках (1440). Важно! Отрабатывается ситуация, когда дежурство сторожа проходит через полночь, т.е., например, начало - 23.00, окончание - 3.30.
Пути к файлам поставьте, естественно, свои.
Код:
CONST
 Max_Number_Of_Guards=10;
VAR
 f:Text;
 Time_Table:Array[1..Max_Number_Of_Guards, 1..2] of Integer;
 Number_Of_Guards:Byte;
 i:Byte;
 j:Word;
 Start,Finish:Real;
 b:Array[1..Max_Number_Of_Guards] of boolean;
 b_sum:boolean;
BEGIN
 Assign(f,'D:\Input.txt');
 Reset(f);
 Readln(f,Number_Of_Guards);
 If Number_Of_Guards>Max_Number_Of_Guards then
  begin
   writeln('Too many guards! Edit the Input file or change Max_Number_Of_Guards');
   readln;
   HALT;
  end;
 For i:=1 to Number_Of_Guards do
  begin
   Readln(f,Start,Finish);
   Time_Table[i,1]:=(Round(Start*100) div 100)*60+(Round(Start*100) mod 100);
   Time_Table[i,2]:=(Round(Finish*100) div 100)*60+(Round(Finish*100) mod 100);
  end;
 Close(f);
 j:=0;
 Repeat
  b_sum:=false;
  For i:=1 to Number_Of_Guards do
   begin
    b[i]:=false;
    If ((Time_Table[i,1]<Time_Table[i,2]) and
        (j>=Time_Table[i,1]) and (j<=Time_Table[i,2])) OR
       ((Time_Table[i,1]>Time_Table[i,2]) and
        (((j>=Time_Table[i,1]-1440) and (j<=Time_Table[i,2])) or
         ((j>=Time_Table[i,1]) and (j<=Time_Table[i,2]+1440)))) then
     b[i]:=true;
    b_sum:=b_sum or b[i];
   end;
  Inc(j);
 Until (Not(b_sum)) or (j=1441);
 Assign(f,'D:\Output.txt');
 Rewrite(f);
 If b_sum then writeln(f,'YES!') else writeln(f,'NO!');
 Close(f);
END.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070