## Sunday, November 29, 2015

### Meeting Room Misc

http://yuanhsh.iteye.com/blog/2196848
At a bus-station, you have time-table for buses arrival and departure. You need to find the minimum number of platforms so that all the buses can be accommodated as per their schedule.
Example: Time table is like below:
```Bus         Arrival         Departure
BusA        0900 hrs        0930 hrs
BusB        0915 hrs        1300 hrs
BusC        1030 hrs        1100 hrs
BusD        1045 hrs        1145 hrs```

Then the answer must be 3. Otherwise the bus-station will not be able to accommodate all the buses.
1. int findPlatform(int arr[], int dep[], int n)
2. {
3.    // Sort arrival and departure arrays
4.    sort(arr, arr+n);
5.    sort(dep, dep+n);
6.
7.    // plat_needed indicates number of platforms needed at a time
8.    int plat_needed = 1, result = 1;
9.    int i = 1, j = 0;
10.
11.    // Similar to merge in merge sort to process all events in sorted order
12.    while (i < n && j < n)
13.    {
14.       // If next event in sorted order is arrival, increment count of
15.       // platforms needed
16.       if (arr[i] < dep[j])
17.       {
18.           plat_needed++;
19.           i++;
20.           if (plat_needed > result)  // Update result if needed
21.               result = plat_needed;
22.       }
23.       else // Else decrement count of platforms needed
24.       {
25.           plat_needed--;
26.           j++;
27.       }
28.    }
29.
30.    return result;
31. }

1. int min_rooms(vector<Interval>& meetings) {
2.     vector<int> times;
3.     for(auto m : meetings) {
4.         times.push_back(m.begin);
5.         times.push_back(-m.end);
6.     }
7.     sort(times.begin(), times.end(), [](int a, int b){
8.         return abs(a) == abs(b) ? a < b : abs(a) < abs(b);
9.     });
10.     int ret = 0, cur = 0;
11.     for(auto t : times) {
12.         if(t >= 0) ret = max(ret, ++cur);
13.         else --cur;
14.     }
15.     return ret;
16. }

You have a number of meetings (with their start and end times). You need to schedule them using the minimum number of rooms. Return the list of meetings in every room.

First we need to realize that randomly schedule meetings to available rooms won’t give you an optimal solution. For example, suppose there are 4 meetings, the (start, end) time are (1, 3), (1, 5), (6, 7), (4, 7). When (1, 3) comes, assign to room A, then (1, 5) comes, assign to room B, then (6, 7) comes, assign to room A as it is available, then (4, 7) comes, both room A and B are not available so we have to assign a new room C for it. However, a better solution is two rooms, room A for meeting (1, 3) (4, 7) and room B for meeting (1, 5) (6, 7).
However, the optimal solution solution is not far from it. If we first sort all the meeting by the start time, then we could just assign them one by one and to the first available room.
The reason is simple, when considering a meeting from s[i] to e[i], as there is no unschedule meeting before s[i], by putting the (s[i], e[i]) meeting in any available room (if there is one) would leads to the same results.
So the code looks like this.
1. void arrange(vector<pair> meeting) { // the pair contains the start and end time.
2.   sort(meeting.begin(), meeting.end());
3.   vector<vector<pair>> room; // for each room, there is a list of meetings.
4.   for (auto m : meeting) {
5.     bool found = False;
6.     for (auto& r : room) {
7.       if (m.first >= r.back().second) // we can arrange the meeting in the room
8.         r.push_back(m);
9.         found = True;
10.         break;
11.       }
12.     }
13.     if (!found) {
14.       room.push_back({m});
15.     }
16.   }
17.   cout << "Requires " << room.size() << " rooms" << endl;
18.   for (int i = 0; i < room.size(); ++i) {
19.     cout << "Room " << i << endl;
20.     for (auto m : room[i]) {
21.       cout << "Meeting: " << m.first << " " << m.second << endl;
22.     }
23.   }

https://hellosmallworld123.wordpress.com/2014/05/30/arranging-the-meeting-room/
If you have only one room, what is the maximum number of meetings you can scheduled into that room.
Solution:
1. sort the meetings by finishing time, this is because we greedily choose the meeting that finishes first.
2. go through all the meetings in order of finishing time, schedule the meeting into the room if the room is not occupied at its start time, and increase the count by one.
3. no of count will be the max number of meetings you can schedule into the room.
We need to prove that the greedy algorithm is correct (choosing the meeting that finishes first can result in a optimal solution) assume there is another schedule S’ that schedules more meetings (k + 1) then the solution S (k solutions). Then at some point the S’ must scheduled some meeting that tm’ ends before the tm scheduled by S. But as we know that since S scheduled meeting that finishes first so the mth meeting must finishes no later than mth scheduled by S’. which is a contradiction.
Feasible problem:
Given a serial of jobs that contains a processTime and a deadLine, check if you can schedule them so that all the Jobs are finished before deadline.
2. Schedule the job by the order of deadline, see if any job can not finish before deadline, if so, it is not possible, otherwise, the problem is feasible.
Minimum Lateness problem:
Assume we have a serial of jobs that contains a processTime and a deadLine, the lateness is the time between the finish time and the deadline of the job, if the job is finished before the deadline, then the lateness is 0. How do you schedule the job to minimize the total lateness?
1. Sort the jobs in deadline
2. step through all the elements in the order of the deadline, pick the earliest deadline and sums up the lateness if exist.
3. return the lateness
Third follow up question, what if each meeting has a priority, how can we schedule a set of meeting that has the largest priority sum given one meeting room?
1. Sort the meetings according to the finish time (like the first question)
2. Try schedule meeting starting from the first one greedily and record the total priority, mark those meetings that has been scheduled
3. Pass through all the meetings and schedule any meeting that has not been marked in previous schedules. record the max total priority