Maximum Employees To Be Invited To A Meeting

Solution For Maximum Employees To Be Invited To A Meeting

Problem Statement:

You are given a list of employees with their corresponding work hours. You need to schedule a meeting and invite the maximum number of employees possible. However, the total work hours of the employees invited to the meeting cannot exceed a certain threshold.

Write a function max_employee_invitees(schedule: List[Tuple[str, int]], work_hours: int) -> int that will take in a list of tuples called schedule where each tuple contains an employee’s name and work hours, and an integer work_hours, the maximum number of work hours that can be accommodated in the meeting and return the maximum number of employees that can be invited while keeping the total work hours under the threshold.

Example Input:

schedule = [('Employee A', 6), ('Employee B', 4), ('Employee C', 3), ('Employee D', 6), ('Employee E', 6)] work_hours = 15

Example Output:

3

Explanation:

Employee A, D, and E can be invited to the meeting as their total work hours sum up to 6+6+3=15 which is equal to the maximum threshold, so the function returns 3.

Solution:

First, we need to sort the given employee schedule based on their work hours in descending order. To solve this problem, we can use two pointers, one starting from the beginning and the other one starting from the end of the list.

The idea here is to select the employee with the most number of work hours and see if adding it to the list makes the total work hours go over the maximum required hours. If it does, we drop the employee that has the least number of work hours and check again. We continue this process of adding and dropping employees until we find the maximum number of employees we can invite while keeping the total work hours under the threshold.

Here is the Python code which will implement the above approach:

“`
from typing import List, Tuple

def max_employee_invitees(schedule: List[Tuple[str, int]], work_hours: int) -> int:

# Sort the employee list based on their work hours in descending order
schedule = sorted(schedule, key=lambda x: x[1], reverse=True)

# Initialize pointers
left, right = 0, len(schedule) - 1
max_employees = 0

# Loop through the employee list using two pointers
while left <= right:
    total_work_hours = schedule[left][1] + schedule[right][1]

    # If only one employee in the list, just check if their work_hours fits in the meeting time
    if left == right:
        if total_work_hours <= work_hours:
            max_employees += 1
        break

    # If total work hours of both left and right pointer exceeds the threshold,
    # then we must decrement the work hours from the employee with the highest work hours
    if total_work_hours > work_hours:
        right -= 1
    else: # Else, we can add the left and right employee to the meeting
        max_employees += 2
        left += 1
        right -= 1

return max_employees

“`

We have implemented the above-mentioned algorithm using two pointers. The left pointer points at the employee with the most number of work hours, and the right pointer points at the employee with the least number of work hours.

First, we sorted the employee list based on their work hours in descending order. Then we initialized the left pointer to point at the beginning of the list and the right pointer to point at the end of the list. We also initialized a variable max_employees to keep track of the maximum number of employees that can attend the meeting.

Next, we looped through the employee list using the two pointers. We checked if the total work hours of the employees pointed by the left and right pointers are within the maximum threshold or not. If it is, then we added both employees to the meeting and increment both pointers and add 2 to the max_employees variable. If not, then we must decrement the right pointer to remove the employee with the least work hours and check again.

We terminate the loop when the left and right pointers cross or point at the same employee (which means there is only one employee left in the list). If there is only one employee left in the list, we just check if their work hours fit in the meeting time or not and update the max_employees variable accordingly.

Finally, we return the max_employees.

Complexity Analysis:

Time Complexity: sorting the array takes O(nlogn) time and then traversing the array using two pointers would take O(n) time. Hence the time complexity of the function is O(nlogn).

Space Complexity: We used only O(1) extra space, so the space complexity of the function, is O(1).

Step by Step Implementation For Maximum Employees To Be Invited To A Meeting

/**
 * // This is the Employee interface.
 * // You should not implement it, or speculate about its implementation
 * interface Employee {
 *     // Returns the id of the employee.
 *     public int getId();
 *
 *     // Returns the importance value of the employee.
 *     public int getImportance();
 *
 *     // Returns the subordinates of the employee.
 *     public List getSubordinates();
 * }
 */

class Solution {
    public int getImportance(List employees, int id) {
        // key: employee id, value: employee
        Map map = new HashMap<>();
        for (Employee e : employees) {
            map.put(e.getId(), e);
        }
        return dfs(map, id);
    }
    
    // return the importance of employee with id
    private int dfs(Map map, int id) {
        Employee e = map.get(id);
        int importance = e.getImportance();
        for (int subId : e.getSubordinates()) {
            importance += dfs(map, subId);
        }
        return importance;
    }
}
def maxEmployees(self, n: int, headID: int, manager: List[int], informTime: List[int]) -> int:
        # create a list of managers and their direct reports
        # key is manager, value is list of reports
        manager_dict = collections.defaultdict(list)
        for i, m in enumerate(manager):
            manager_dict[m].append(i)
        # do a breadth first search, keeping track of the longest time to inform everyone
        # at each level, we add the time it takes to inform the employees at that level
        # and then add the employees at the next level
        queue = collections.deque()
        queue.append((headID, 0))
        max_time = 0
        while queue:
            cur_employee, cur_time = queue.popleft()
            # update the max time
            max_time = max(max_time, cur_time)
            # add the next level of employees
            for report in manager_dict[cur_employee]:
                queue.append((report, cur_time + informTime[cur_employee]))
        return max_time
var maxEmployees = function(employees, manager, maxInvites) {
    // keep track of visited employees
    let visited = new Set();
    // keep track of employees that can be invited
    let canInvite = [];
    // keep track of current manager
    let currentManager = manager;
    // keep track of next manager
    let nextManager;
    // loop through employees
    for (let i = 0; i < employees.length; i++) {
        // if the current employee has not been visited
        if (!visited.has(employees[i])) {
            // add the employee to the visited set
            visited.add(employees[i]);
            // if the employee is the current manager
            if (employees[i] === currentManager) {
                // add the employee to the canInvite array
                canInvite.push(employees[i]);
                // set the next manager to be the direct report
                nextManager = employees[i].directReport;
                // if the canInvite array has reached the max number of invites
                if (canInvite.length === maxInvites) {
                    // return the canInvite array
                    return canInvite;
                }
            }
            // if the employee is not the current manager
            else {
                // set the next manager to be the direct report
                nextManager = employees[i].directReport;
                // while the next manager is not the current manager
                while (nextManager !== currentManager) {
                    // if the next manager has not been visited
                    if (!visited.has(nextManager)) {
                        // add the next manager to the visited set
                        visited.add(nextManager);
                        // set the next manager to be the direct report
                        nextManager = nextManager.directReport;
                    }
                    // if the next manager has been visited
                    else {
                        // break out of the while loop
                        break;
                    }
                }
                // if the next manager is the current manager
                if (nextManager === currentManager) {
                    // add the employee to the canInvite array
                    canInvite.push(employees[i]);
                    // if the canInvite array has reached the max number of invites
                    if (canInvite.length === maxInvites) {
                        // return the canInvite array
                        return canInvite;
                    }
                }
            }
            // set the current manager to be the next manager
            currentManager = nextManager;
        }
    }
    // return the canInvite array
    return canInvite;
};
This is a classic problem that can be solved using a greedy algorithm. The basic idea is to sort the employees by their start time, and then invite the first K employees to the meeting.

We can sort the employees by their start time in O(NlogN) time. Then, we can invite the first K employees in O(K) time. Therefore, the overall time complexity of the algorithm is O(NlogN + K).

#include 
#include 
#include 

using namespace std;

struct Employee {
    int start;
    int end;
};

bool cmp(Employee &a, Employee &b) {
    return a.start < b.start;
}

int maxEmployees(vector &employees, int K) {
    sort(employees.begin(), employees.end(), cmp);
    
    int count = 0;
    int end = -1;
    for (int i = 0; i < K; i++) {
        if (employees[i].start <= end) {
            continue;
        }
        count++;
        end = employees[i].end;
    }
    return count;
}

int main() {
    vector employees = {{1, 10}, {2, 3}, {5, 8}, {4, 7}};
    int K = 3;
    cout << maxEmployees(employees, K) << endl;
    return 0;
}
using System; 

public class Solution { 

public static int MaximumEmployees(int M, int N, List> employeeAvailability) { 

// M is the number of days in the work week 
// N is the number of employees 
// employeeAvailability is a list of lists where each sublist represents the availability of an employee for each day of the work week 

// your code goes here 

} 
}


Scroll to Top
[gravityforms id="5" description="false" titla="false" ajax="true"]