Advertisement
Alex_St

Задача о задачах

Nov 14th, 2022
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <tuple>
  5. #include <vector>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. // Перечислимый тип для статуса задачи
  11. enum class TaskStatus {
  12.     NEW,          // новая
  13.     IN_PROGRESS,  // в разработке
  14.     TESTING,      // на тестировании
  15.     DONE          // завершена
  16. };
  17.  
  18. // Объявляем тип-синоним для map<TaskStatus, int>,
  19. // позволяющего хранить количество задач каждого статуса
  20. using TasksInfo = map<TaskStatus, int>;
  21.  
  22.  
  23. class TeamTasks {
  24. private:
  25.     map<string, map<TaskStatus, int>> task_info_; //здесь содержится вся информация о текущем статусе задач по каждому исполнителю
  26.  
  27.  
  28. public:
  29.     // Получить статистику по статусам задач конкретного разработчика
  30.     const TasksInfo& GetPersonTasksInfo(const string& person) const
  31.     {
  32.         return task_info_.at(person);
  33.     }
  34.  
  35.     // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
  36.     void AddNewTask(const string& person)
  37.     {
  38.         task_info_[person][TaskStatus::NEW] += 1;
  39.         task_info_[person][TaskStatus::IN_PROGRESS] += 0;
  40.         task_info_[person][TaskStatus::TESTING] += 0;
  41.         task_info_[person][TaskStatus::DONE] += 0;
  42.  
  43.         //task_info_.insert({ person, { { TaskStatus::NEW, 1 } } });    // можно использовать но он будет заменять каждый раз новым TaskStatus::NEW
  44.         //task_info_.emplace( person, TaskStatus::NEW, 1 );             // не применим, т.к. нельзя использовать его если внутри map есть другой кнтейнер с ключём??
  45.     }
  46.  
  47.     // Обновить статусы по данному количеству задач конкретного разработчика,
  48.     // подробности см. ниже
  49.     tuple<TasksInfo, TasksInfo> PerformPersonTasks(const string& person, int task_count)
  50.     {
  51.         TasksInfo refreshed_tasks;
  52.         TasksInfo not_refreshed_tasks;
  53.         map<TaskStatus, int> aux_status;
  54.         vector<TaskStatus> aux_array;
  55.         TasksInfo& ref_at_person = task_info_.at(person); // вспомогательная ссылка
  56.  
  57.         if (task_info_.count(person) == 0)
  58.             return { refreshed_tasks, not_refreshed_tasks }; // возвращаем пустые контейнеры по условию если нет заданного человека в базе
  59.  
  60.         int num_of_unsolved = ref_at_person[TaskStatus::NEW] + ref_at_person[TaskStatus::IN_PROGRESS] + ref_at_person[TaskStatus::TESTING]; //считаем количество невыполненных заданий
  61.         if (task_count < num_of_unsolved) //количество обновлений не может превышать количество невыполненных заданий по условию
  62.             num_of_unsolved = task_count;
  63.  
  64.         for (int i = 0; i < 3;++i)
  65.         {
  66.             if (num_of_unsolved == 0)
  67.                 break;
  68.             if (ref_at_person[static_cast<TaskStatus>(i)] <= num_of_unsolved)
  69.             {
  70.                 aux_status[static_cast<TaskStatus>(i + 1)] = ref_at_person[static_cast<TaskStatus>(i)];
  71.                 num_of_unsolved -= ref_at_person[static_cast<TaskStatus>(i)];
  72.             }
  73.             else
  74.             {
  75.                 aux_status[static_cast<TaskStatus>(i + 1)] = num_of_unsolved;
  76.                 num_of_unsolved = 0;
  77.             }
  78.         }
  79.         ////выводим aux_status
  80.         //for (const auto& it : aux_status)
  81.         //  cout << static_cast<int>(it.first) << "   " << (it.second) << endl;
  82.  
  83.         for (int i = 0; i < 4;++i)
  84.         {
  85.             if (aux_status.count(static_cast<TaskStatus>(i))) //если в aux_status есть элементы со статусом i (NEW, IN_PROGRESS, TESTING или DONE)
  86.                 refreshed_tasks[static_cast<TaskStatus>(i)] = aux_status[static_cast<TaskStatus>(i)];
  87.  
  88.             if (i != 3)
  89.                 if (ref_at_person[static_cast<TaskStatus>(i)] - aux_status[static_cast<TaskStatus>(i + 1)])
  90.                     not_refreshed_tasks[static_cast<TaskStatus>(i)] = ref_at_person[static_cast<TaskStatus>(i)] - aux_status[static_cast<TaskStatus>(i + 1)];
  91.  
  92.             if (i == 3)
  93.                 ref_at_person[static_cast<TaskStatus>(i)] += aux_status[static_cast<TaskStatus>(i)];
  94.             else
  95.                 ref_at_person[static_cast<TaskStatus>(i)] += aux_status[static_cast<TaskStatus>(i)] - aux_status[static_cast<TaskStatus>(i + 1)];
  96.         }
  97.  
  98.         return { refreshed_tasks, not_refreshed_tasks };
  99.     }
  100. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement