Матч
407, Зарплата в корпорации (CorporationSalary)
Дивизион 2,
Уровень 2; Дивизион 1, Уровень 1
Вы работаете менеджером в большой
корпорации. Каждый работник имеет несколько прямых менеджеров и несколько
непосредственных подчиненных. Будем говорить, что X является боссом Y, если
существует такая последовательность работников A, B , …, D, что X является
менеджером A, A является менеджером B и так далее, а D является менеджером Y
(если X является прямым менеджером Y, то X является боссом Y). Если X является
боссом Y, то Y не является боссом X. Зарплата работника, не имеющего
подчиненных, равна 1. Иначе зарплата работника равна сумме зарплат всех его
подчиненных.
Массив relations описывает
отношение “менеджер/подчиненный”. Если relations[i][j] = ‘Y’, то i - ый работник является прямым
менеджером j - ого работника. Иначе relations[i][j] = ‘N’. Найти сумму
зарплат всех работников.
Класс: CorporationSalary
Метод: long totalSalary(vector<string> relations)
Ограничения: relations содержит от 1 до 50 элементов, все
элементы relations[i] содержат одинаковое количество букв ‘Y’ или ‘N’.
Вход. Массив relations, описывающий отношения между работниками.
Выход. Сумма зарплат всех работников.
Пример входа
relations |
{"N"} |
{"NNYN", "NNYN", "NNNN", "NYYN"} |
{"NNNNNN", "YNYNNY", "YNNNNY", "NNNNNN", "YNYNNN", "YNNYNN"} |
Пример выхода
1
5
17
РЕШЕНИЕ
графы – поиск в глубину
Массив
relations задает матрицу смежности ориентированного графа. Совершим
топологическую сортировку вершин графа. Функция dfs(i) вычисляет зарплату i -го работника, и сохраняет ее в ячейке salary[i]. Сумма зарплат
всех работников равна сумме элементов массива salary.
ПРОГРАММА
#include <cstdio>
#include <string>
#include <vector>
#include <memory>
#include <numeric>
using namespace std;
long long salary[50];
vector<string> rel;
long long dfs(int i)
{
int j;
long long &res =
salary[i];
if (salary[i] > 0) return
salary[i];
for(res = j = 0; j < rel.size(); j++)
if (rel[i][j] == 'Y') res += dfs(j);
if (!res) res = 1;
return res;
}
class CorporationSalary
{
public:
long long
totalSalary(vector<string> relations)
{
memset(salary,0,sizeof(salary)); rel =
relations;
for(int
i = 0; i < relations.size(); i++)
if (!salary[i]) dfs(i);
return accumulate(salary,salary + relations.size(),(long long)0);
}
};