Find maximum meetings in one room
There is one meeting room in a firm. There are N meetings in the form of (S[i], F[i]) where S[i] is the start time of meeting i and F[i] is the finish time of meeting i. The task is to find the maximum number of meetings that can be accommodated in the meeting room. Print all meeting numbers
Examples:
Input : s[] = {1, 3, 0, 5, 8, 5}, f[] = {2, 4, 6, 7, 9, 9}
Output : 1 2 4 5
First meeting [1, 2]
Second meeting [3, 4]
Fourth meeting [5, 7]
Fifth meeting [8, 9]Input : s[] = {75250, 50074, 43659, 8931, 11273, 27545, 50879, 77924},
f[] = {112960, 114515, 81825, 93424, 54316, 35533, 73383, 160252 }
Output : 6 7 1
Approach:
Idea is to solve the problem using the greedy approach which is the same as Activity Selection Problem.
- Sort all pairs(Meetings) in increasing order of second number(Finish time) of each pair.
- Select first meeting of sorted pair as the first Meeting in the room and push it into result vector and set a variable time_limit(say) with the second value(Finishing time) of the first selected meeting.
- Iterate from the second pair to last pair of the array and if the value of the first element(Starting time of meeting) of the current pair is greater then previously selected pair finish time (time_limit) then select the current pair and update the result vector (push selected meeting number into vector) and variable time_limit.
- Print the Order of meeting from vector.
Below is the implementation of the above approach.
C++
// C++ program to find maximum number of meetings #include <bits/stdc++.h> using namespace std; // Function for finding maximum meeting in one room void maxMeetings( int s[], int f[], int n) { pair< int , int > a[n + 1]; int i; for (i = 0; i < n; i++) { a[i].first = f[i]; a[i].second = i; } // Sorting of meeting according to their finish time. sort(a, a + n); // Time_limit to check whether new // meeting can be conducted or not. int time_limit = a[0].first; // Vector for storing selected meeting. vector< int > m; // Initially select first meeting. m.push_back(a[0].second + 1); // Check for all meeting whether it // can be selected or not. for (i = 1; i < n; i++) { if (s[a[i].second] > time_limit) { // Push selected meeting to vector m.push_back(a[i].second + 1); // update time limit time_limit = a[i].first; } } // Print final selected meetings. for ( int i = 0; i < m.size(); i++) { cout << m[i] << " " ; } } // Driver code int main() { // Starting time int s[] = { 1, 3, 0, 5, 8, 5 }; // Finish time int f[] = { 2, 4, 6, 7, 9, 9 }; // Number of meetings. int n = sizeof (s) / sizeof (s[0]); // Function call maxMeetings(s, f, n); return 0; } |
Java
// Java program to find maximum number of meetings import java.util.*; // Comparator function which can compare // the ending time of the meeting ans // sort the list class mycomparator implements Comparator<meeting> { @Override public int compare(meeting o1, meeting o2) { if (o1.end < o2.end) { // Return -1 if second object is // bigger then first return - 1 ; } else if (o1.end > o2.end) // Return 1 if second object is // smaller then first return 1 ; return 0 ; } } // Custom class for storing starting time, // finishing time and position of meeting. class meeting { int start; int end; int pos; meeting( int start, int end, int pos) { this .start = start; this .end = end; this .pos = pos; } } class GFG{ // Function for finding maximum meeting in one room public static void maxMeeting(ArrayList<meeting> al, int s) { // Initialising an arraylist for storing answer ArrayList<Integer> m = new ArrayList<>(); int time_limit = 0 ; mycomparator mc = new mycomparator(); // Sorting of meeting according to // their finish time. Collections.sort(al, mc); // Initially select first meeting. m.add(al.get( 0 ).pos); // time_limit to check whether new // meeting can be conducted or not. time_limit = al.get( 0 ).end; // Check for all meeting whether it // can be selected or not. for ( int i = 1 ; i < al.size(); i++) { if (al.get(i).start > time_limit) { // Add selected meeting to arraylist m.add(al.get(i).pos); // Update time limit time_limit = al.get(i).end; } } // Print final selected meetings. for ( int i = 0 ; i < m.size(); i++) System.out.print(m.get(i) + 1 + " " ); } // Driver Code public static void main (String[] args) { // Starting time int s[] = { 1 , 3 , 0 , 5 , 8 , 5 }; // Finish time int f[] = { 2 , 4 , 6 , 7 , 9 , 9 }; // Defining an arraylist of meet type ArrayList<meeting> meet = new ArrayList<>(); for ( int i = 0 ; i < s.length; i++) // Creating object of meeting // and adding in the list meet.add( new meeting(s[i], f[i], i)); // Function call maxMeeting(meet, meet.size()); } } // This code is contributed by Sarthak Sethi |
Python3
# Python3 program to find maximum number # of meetings # Custom class for storing starting time, # finishing time and position of meeting. class meeting: def __init__( self , start, end, pos): self .start = start self .end = end self .pos = pos # Function for finding maximum # meeting in one room def maxMeeting(l, n): # Initialising an arraylist # for storing answer ans = [] # Sorting of meeting according to # their finish time. l.sort(key = lambda x: x.end) # Initially select first meeting ans.append(l[ 0 ].pos) # time_limit to check whether new # meeting can be conducted or not. time_limit = l[ 0 ].end # Check for all meeting whether it # can be selected or not. for i in range ( 1 , n): if l[i].start > time_limit: ans.append(l[i].pos) time_limit = l[i].end # Print final selected meetings for i in ans: print (i + 1 , end = " " ) print () # Driver code if __name__ = = '__main__' : # Starting time s = [ 1 , 3 , 0 , 5 , 8 , 5 ] # Finish time f = [ 2 , 4 , 6 , 7 , 9 , 9 ] # Number of meetings. n = len (s) l = [] for i in range (n): # Creating object of meeting # and adding in the list l.append(meeting(s[i], f[i], i)) # Function call maxMeeting(l, n) # This code is contributed by MuskanKalra1 |
Javascript
<script> // JavaScript program to find maximum number of meetings // Function for finding maximum meeting in one room function maxMeetings(s, f, n) { //Make an Array : aCollectiveArray like [[index, startTime, endTime]] //index will be stored as i + 1, to start indices from 1. var aCollectiveArray = []; for ( var i=0; i<s.length; i++){ var aNew = []; aNew.push(i + 1); aNew.push(s[i]); aNew.push(f[i]); aCollectiveArray.push(aNew); } //array sorted based on end Time aCollectiveArray.sort((a,b) => a[2] - b[2]); //endTime is at 2nd index of subarray inside aCollectiveArray var endTime = aCollectiveArray[0][2]; //result will contain the indices of meetings var result = []; //first meeting will be bydefault push as array is already sorted result.push(aCollectiveArray[0][0]); //will compare if next startTime > prev endTime for ( var k=1; k<aCollectiveArray.length; k++){ var startTime = aCollectiveArray[k][1]; if (startTime > endTime){ result.push(aCollectiveArray[k][0]); endTime = aCollectiveArray[k][2] } } //If we need to return indices then will return : result //or else if we need to return number of meetings then will return result.length return result; } // Driver code // Starting time let s = [ 1, 3, 0, 5, 8, 5 ]; // Finish time let f = [ 2, 4, 6, 7, 9, 9 ]; // Number of meetings. let n = s.length; // Function call maxMeetings(s, f, n); //This code is contributed by Ankit Kumar. </script> |
Output:
1 2 4 5
Time Complexity: O(N log(N))
Auxiliary Space: O(2*N) for creating a vector of pairs that is approximately equal to O(n)