Форум программистов, компьютерный форум CyberForum.ru

Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год. - C++

Восстановить пароль Регистрация
 
vasiliy9211
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 20
28.09.2016, 08:25     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год. #1
есть программа написанная на паскале. мне нужно в c++. пропустил несколько занятий в универе и не могу теперь написать программу. help me.
Рабочее время

Иван Иванович – очень ответственный, но очень рассеянный человек. Поэтому когда он начинает очередное дело, он на отдельном листочке пишет дату и время начала (например, 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
вот код на паскале:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2016, 08:25     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год.
Посмотрите здесь:

Free Pascal Найти наименьший год в записи
Помогите задача 11 класса!!! Free Pascal
Помогите Васе узнать минимально возможное общее число студентов в его университете Free Pascal
Free Pascal В массиве данных найти год
Определить по времени установки пирога в духовку время, когда будет подходящее время для его извлечения Free Pascal
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ФедосеевПавел
Модератор
1534 / 715 / 304
Регистрация: 01.02.2015
Сообщений: 2,291
28.09.2016, 09:17     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год. #2
Я не пойму принцип приведённого алгоритма. Когда-то решал эту задачу тривиально:
1. Представил все события на одной оси времени. Т.е. сначала записал в массив "ось времени" (Events) все события, а затем отсортировал их (упорядочил по возрастанию). Тут применил трюк, недопустимый в PABC.NET - содержимое переменной типа TTimeStamp можно представить или как одно число или как два (дата и время в минутах).
2. Теперь все события упорядочены. Перебираем "листочки" и учитываем, что если работа заняла несколько дней, то она прерывалась в 18:00 и возобновлялась в 10:00.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
program acmp_0184;
 
type
  TTimeStamp = record
    case integer of
      0: (Time, Date: word);
      1: (DateTime: dword)
  end;
  TListEvents = array of TTimeStamp;
const
  Days: array[1..12] of word = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
const
  TimeStart = 10 * 60;
  TimeStop  = 18 * 60;
 
  procedure QuickSort(var a: TListEvents; N: integer);
 
    procedure sort(l, r: integer);
    var
      i, j: integer;
      x, y: TTimeStamp;
    begin
      i := l;
      j := r;
      x := a[l + random(r - l)];
      repeat
        while a[i].DateTime < x.DateTime do
          i := i + 1;
        while x.DateTime < a[j].DateTime do
          j := j - 1;
        if i <= j then
        begin
          if a[i].DateTime > a[j].DateTime then
          begin
            y := a[i];
            a[i] := a[j];
            a[j] := y;
          end;
          i := i + 1;
          j := j - 1;
        end;
      until i >= j;
      if l < j then
        sort(l, j);
      if i < r then
        sort(i, r);
    end; {sort}
 
  begin
    {quicksort};
    sort(0, N - 1);
  end;
 
var
  Events: TListEvents;
  K: integer;
  s: string;
  temp: integer;
  i: integer;
  WorkTime: dword;
begin
  readln(K);
  setlength(Events, K);
  for i := 0 to K - 1 do
  begin
    readln(s);
    val(copy(s, 1, 2), Events[i].Date);
    val(copy(s, 4, 2), temp);
    Events[i].Date := Events[i].Date + Days[temp];
    val(copy(s, 8, 2), temp);
    val(copy(s, 11, 2), Events[i].Time);
    Events[i].Time := Events[i].Time + 60 * temp;
  end;
 
  QuickSort(Events, K);
 
  WorkTime := 0;
  i := 0;
  while i < K do
  begin
    while Events[i].Date <> Events[i + 1].Date do
    begin
      WorkTime := WorkTime + TimeStop - Events[i].Time;
      Events[i].Time := TimeStart;
      Inc(Events[i].Date);
    end;
    WorkTime := WorkTime + Events[i + 1].Time - Events[i].Time + 1;
    Inc(i, 2);
  end;
 
  temp := WorkTime mod 60;
  Str(temp: 2, s);
  if s[1] = ' ' then
    s[1] := '0';
  writeln(WorkTime div 60, ':', s);
end.
Думаю, что этот код перевести в C/C++ легче. Да и алгоритм понятнее - можно самостоятельно реализовать.

Добавлено через 3 минуты
Ха-ха. Пока отвечал - тема переехала из Pascal в С++.
Puporev
28.09.2016, 09:43
  #3

Не по теме:

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
тема переехала из Pascal в С++.
Перенес, пусть здесь маются, мы свое отмаялись здесь.
Задача "Рабочее время"

Joy
1760 / 925 / 696
Регистрация: 29.08.2014
Сообщений: 3,335
29.09.2016, 18:12     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год. #4
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Я не пойму принцип приведённого алгоритма
да табель по дням в рабочих минутах заполняю [101 - первое января..3112-31 декабря, 480 - число минут в сутках], потом сумму считаю и выдаю результат.

Добавлено через 6 минут
*480 - число рабочих минут в сутках.
Yandex
Объявления
29.09.2016, 18:12     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год.
Ответ Создать тему
Опции темы

Текущее время: 11:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru