Задача "Рабочее время" - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Задача:

Рабочее время (Время: 1 сек. Память: 16 Мб Сложность: 26%)
Иван Иванович – очень ответственный, но очень рассеянный человек. Поэтому когда он начинает очередное дело, он на отдельном листочке пишет дату и время начала (например, 29.01. 10:30), а когда заканчивает, то так же на отдельном листочке – дату и время окончания (например, 02.02. 12:15). Листочки аккуратно укладываются в стопку один на другой. А так как одновременно Иван Иванович может заниматься только одним делом, то листочки однозначно упорядочены в стопке: листок начала какого-то дела, листок окончания этого дела, листок начала, листок окончания… и т.д. Дело начинается в начале минуты, указанной в листочке начала этого дела, а заканчивается в конце минуты, указанной на листочке окончания. Иван Иванович ходит на работу каждый день и его рабочий день продолжается с 10:00 до 18:00. Таким образом, пара листочков «18.11. 15:13» — «20.11. 10:27» была написана при начале и окончании дела длительностью 11ч.15м. Однажды в конце декабря уборщица Дуся нечаянно уронила эту стопку на пол и, не зная важной закономерности их укладки, собрала листочки обратно в каком-то произвольном порядке. Иван Иванович обнаружил этот прискорбный факт только 31 декабря, когда ему надо было произвести учет своего рабочего времени за год. Год был невисокосный. Помогите Ивану Ивановичу найти его суммарные затраты времени за год.

Пример:

Input.txt: 4 15.01. 17:00 16.01. 12:00 11.02. 14:00 30.01. 10:00 Output.txt: 103:02 Я пытался решить эту задачу и тест за тестом проваливался, я понял что вношу слишком много правок в свой код, что означает, что я попросту выбрал неверную идею решения. Помогите решить задачу. Мне нужен код на паскале(использую FreePascal 2.6.4) или идея решения на псевдокоде.

Решение задачи: «Задача "Рабочее время"»

textual
Листинг программы
uses SysUtils;
var
  i,j,tmin,tmax,k:longint;
  s:string;
  t:array[100..3113,0..480] of boolean;
  b:boolean;
begin
  readln(k);
  tmin:=3112;tmax:=100;
  for k:=1 to k do begin
    readln(s);
    i:=StrToInt(s[4]+s[5]+s[1]+s[2]);
    if i>tmax then tmax:=i;
    if i<tmin then tmin:=i;
    j:=strtoint(s[8]+s[9])*60+strtoint(s[11]+s[12])-600;
    t[i,j]:=true;
  end;
  k:=0;
  i:=tmin;
  repeat
    if ((i div 100 in [1,3,5,7,8,10]) and (i mod 100=32)) or
        ((i div 100 in [4,6,9,11]) and (i mod 100=31)) or
        ((i div 100 =2) and (i mod 100=29)) then i:=(i div 100+1)*100+1;
     for j:=0 to 480 do begin
       if t[i,j] then begin
         b:=not b;
         if not b then k:=k+1;
       end;
       if b then k:=k+1;
     end;
     k:=k-ord(b);
     i:=i+1;
  until i>tmax;
  if k mod 60<10 then s:=':0' else s:=':';
  writeln(k div 60,s,k mod 60);
end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы