fork download
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <tuple>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. // Перечислимый тип для статуса задачи
  10. enum class TaskStatus {
  11. NEW, // новая
  12. IN_PROGRESS, // в разработке
  13. TESTING, // на тестировании
  14. DONE // завершена
  15. };
  16.  
  17. // Объявляем тип-синоним для map<TaskStatus, int>,
  18. // позволяющего хранить количество задач каждого статуса
  19. using TasksInfo = map<TaskStatus, int>;
  20.  
  21. class TeamTasks {
  22. public:
  23.  
  24. // Получить статистику по статусам задач конкретного разработчика
  25. const TasksInfo& GetPersonTasksInfo(const string& person) const
  26. {
  27. return person_tasks_.at(person);
  28. };
  29.  
  30. // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
  31. void AddNewTask(const string& person)
  32. {
  33. ++person_tasks_[person][TaskStatus::NEW];
  34. };
  35.  
  36. // Обновить статусы по данному количеству задач конкретного разработчика,
  37. // подробности см. ниже
  38. tuple<TasksInfo, TasksInfo> PerformPersonTasks(const string& person, int task_count)
  39. {
  40. TasksInfo updated_tasks, untouched_tasks;
  41. TasksInfo& tasks = person_tasks_[person];
  42. if (person_tasks_.count(person) == 0) {
  43. return {updated_tasks, untouched_tasks};
  44. }
  45.  
  46. vector<TaskStatus> statuses = {TaskStatus::NEW, TaskStatus::IN_PROGRESS, TaskStatus::TESTING};
  47. for (TaskStatus status : statuses) {
  48. int count = tasks[status];
  49. if (count > 0) {
  50. int updated = min(count, task_count);
  51. updated_tasks[static_cast<TaskStatus>(static_cast<int>(status) + 1)] += updated;
  52. tasks[status] -= updated;
  53. task_count -= updated;
  54. }
  55. }
  56.  
  57. for (const auto& [status, count] : tasks) {
  58. if (status != TaskStatus::DONE) {
  59. untouched_tasks[status] = count;
  60. }
  61. }
  62.  
  63. return {updated_tasks, untouched_tasks};
  64. };
  65. /*TasksInfo updated_tasks, untouched_tasks;
  66.   auto& tasks = person_tasks_[person];
  67.  
  68.   for (auto status = TaskStatus::NEW; status != TaskStatus::DONE; status = static_cast<TaskStatus>(static_cast<int>(status) + 1)) {
  69.   int count = min(task_count, tasks[status]);
  70.   if (count > 0) {
  71.   updated_tasks[static_cast<TaskStatus>(static_cast<int>(status) + 1)] += count;
  72.   tasks[static_cast<TaskStatus>(static_cast<int>(status) + 1)] += count;
  73.   tasks[status] -= count;
  74.   task_count -= count;
  75.   }
  76.   if (tasks[status] > 0) {
  77.   untouched_tasks[status] = tasks[status];
  78.   }
  79.   }
  80.   return {updated_tasks, untouched_tasks};
  81.   update = (count > task_count) ? task_count : count;
  82.   count -= update;
  83.   tasks[static_cast<TaskStatus>(static_cast<int>(status) + 1)] += update;
  84.   update_tasks[status] = update;
  85.   task_count -= update;
  86.   if (task_count == 0) {
  87.   break;
  88.   }
  89.   }
  90.   for (const auto& [status, count] : tasks)
  91.   {
  92.   if (status != TaskStatus::DONE)
  93.   {
  94.   old_tasks[status] = count;
  95.   }
  96.   }
  97.   return {update_tasks, old_tasks};*/
  98.  
  99.  
  100. private:
  101. map<string, TasksInfo> person_tasks_;
  102. };
  103.  
  104. // Принимаем словарь по значению, чтобы иметь возможность
  105. // обращаться к отсутствующим ключам с помощью [] и получать 0,
  106. // не меняя при этом исходный словарь.
  107. void PrintTasksInfo(TasksInfo tasks_info) {
  108. cout << tasks_info[TaskStatus::NEW] << " new tasks"s
  109. << ", "s << tasks_info[TaskStatus::IN_PROGRESS] << " tasks in progress"s
  110. << ", "s << tasks_info[TaskStatus::TESTING] << " tasks are being tested"s
  111. << ", "s << tasks_info[TaskStatus::DONE] << " tasks are done"s << endl;
  112. }
  113.  
  114. int main() {
  115. TeamTasks tasks;
  116. tasks.AddNewTask("Ilia"s);
  117. for (int i = 0; i < 3; ++i) {
  118. tasks.AddNewTask("Ivan"s);
  119. }
  120. cout << "Ilia's tasks: "s;
  121. PrintTasksInfo(tasks.GetPersonTasksInfo("Ilia"s));
  122. cout << "Ivan's tasks: "s;
  123. PrintTasksInfo(tasks.GetPersonTasksInfo("Ivan"s));
  124.  
  125. TasksInfo updated_tasks, untouched_tasks;
  126.  
  127. tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan"s, 2);
  128. cout << "Updated Ivan's tasks: "s;
  129. PrintTasksInfo(updated_tasks);
  130. cout << "Untouched Ivan's tasks: "s;
  131. PrintTasksInfo(untouched_tasks);
  132.  
  133. tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan"s, 2);
  134. cout << "Updated Ivan's tasks: "s;
  135. PrintTasksInfo(updated_tasks);
  136. cout << "Untouched Ivan's tasks: "s;
  137. PrintTasksInfo(untouched_tasks);
  138. }
Success #stdin #stdout 0.01s 5296KB
stdin
Standard input is empty
stdout
Ilia's tasks: 1 new tasks, 0 tasks in progress, 0 tasks are being tested, 0 tasks are done
Ivan's tasks: 3 new tasks, 0 tasks in progress, 0 tasks are being tested, 0 tasks are done
Updated Ivan's tasks: 0 new tasks, 2 tasks in progress, 0 tasks are being tested, 0 tasks are done
Untouched Ivan's tasks: 1 new tasks, 0 tasks in progress, 0 tasks are being tested, 0 tasks are done
Updated Ivan's tasks: 0 new tasks, 1 tasks in progress, 0 tasks are being tested, 0 tasks are done
Untouched Ivan's tasks: 0 new tasks, 0 tasks in progress, 0 tasks are being tested, 0 tasks are done