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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Builder БД Передача значения переменной в SQL запрос к базе данных http://www.cyberforum.ru/cpp-beginners/thread1815115.html
День добрый! Мне необходимо найти в базе данных строчку, id адрес которой соответствует числу занесенному в переменную. for(int g=0; g < vector_size ;g++) { str = svec.c_str(); //переводим цифры из wstring в string numv = StrToInt(str); //переводим цифры в integer }
C++ Записать математические формулы Пожалуйста П.5.18.Правил Запрещено размещать задания и решения в виде картинок и других файлов с их текстом. ha=bsiny V=пR2H http://www.cyberforum.ru/cpp-beginners/thread1815104.html
Ошибка в поэлементном сравнении элементов матрицы C++
не правильно сравнивает, помогите исправить. что с условием сделать, чтобы сравнивало поелементно каждую строку. Т.е. при сравнении 1 и 2 строк, получим,что 2>1, 5>4, но 3 меньше 5 следовательно строка 1 не больше строки 2. а тут выводит, что больше... не понимаю как изменить. #include <iostream> using namespace std; int main() { const int n = 3, m = 4;
указатель стал 0xCDCDCDCD C++
Ошибка пишет current стал равным 0xCDCDCDCD в чем проблема? мне кажется в операции присваивания #include <iostream> using namespace std; struct Single_node { Single_node *next;
C++ Объяснить нюансы оптимизации заданного фрагмента кода http://www.cyberforum.ru/cpp-beginners/thread1815065.html
Наткнулся на статью по оптимизации кода на C++http://itw66.ru/blog/c_plus_plus/13.html]ссылка Есть там 10-й пункт: SomeClass* p; - указатель на массив элементов x = *(p++); - значительно эффективнее x = *(++p);По той же причине что и пункт 1. В первом случае будет осуществляться разыменование указателя и его инкремент параллельно, а во втором — последовательно. Пункт 1: Используйте...
C++ Удаление строк из двумерного массива Подскажите, пожалуйста, как исправить код, чтобы удалялись только те строки, что поэлементно меньше. Т.е.т.е. 1 4 5 3 и 1 3 5 2 --------------- удалится должна нижняя строка, но если была бы хоть одна цифры в 2ой строке больше чем в 1, то они остались бы оба. В моем случае удалится должны только 2ая, 3ая, и 8 строка. Так как 2 доминирует над 8, 6ая доминирует над 2 7ая доминирует над 3 подробнее

Показать сообщение отдельно
ФедосеевПавел
Модератор
1549 / 730 / 308
Регистрация: 01.02.2015
Сообщений: 2,333
28.09.2016, 09:17     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год.
Я не пойму принцип приведённого алгоритма. Когда-то решал эту задачу тривиально:
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 в С++.
 
Текущее время: 04:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru