One thing to note, the items in the schedule list may not be given in the order of timeline. Here is the codes to solve the problem:
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <assert.h>
#include <algorithm>
#include <math.h>
#include <ctime>
#include <functional>
#include <string.h>
#include <stdio.h>
#include <numeric>
#include <float.h>
using namespace std;
/*
4.6.4
*/
struct TimeSlot{
int startHour, startMinute, last;
int endHour, endMinute;
void setStartTime(string s) {
startHour = (s[0] - '0') * 10 + (s[1] - '0');
startMinute = (s[3] - '0') * 10 + (s[4] - '0');
}
void setEndTime(string s) {
endHour = (s[0] - '0') * 10 + (s[1] - '0');
endMinute = (s[3] - '0') * 10 + (s[4] - '0');
}
void cal() {
if (endMinute < startMinute) {
endHour--;
endMinute += 60;
}
last = (endHour - startHour) * 60 + (endMinute - startMinute);
}
bool operator<(TimeSlot ts) {
if (last < ts.last) return true;
if (last == ts.last)
{
if (startHour > ts.startHour)
return true;
if (startHour == ts.startHour && startMinute > ts.startMinute)
return true;
}
return false;
}
};
ostream& operator<<(ostream& os, TimeSlot ts) {
os << "the longest nap starts at " << ts.startHour << ":";
if (ts.startMinute < 10) {
os << "0";
}
os << ts.startMinute << " and will last for ";
if (ts.last >= 60) {
os << ts.last / 60 << " hours and ";
}
os << ts.last % 60 << " minutes." << endl;
return os;
}
void solution(vector<string> &v) {
vector<TimeSlot> vts;
vector<string> rawTimes;
rawTimes.push_back("10:00");
for (int i = 0; i < v.size(); i++) {
string t1, t2;
stringstream ss(v[i]);
ss >> t1 >> t2;
rawTimes.push_back(t1);
rawTimes.push_back(t2);
}
rawTimes.push_back("18:00");
sort(rawTimes.begin(), rawTimes.end());
for (int i = 0; i < rawTimes.size(); i += 2) {
TimeSlot ts;
ts.setStartTime(rawTimes[i]);
ts.setEndTime(rawTimes[i + 1]);
ts.cal();
vts.push_back(ts);
}
sort(vts.begin(), vts.end());
cout << vts.back();
}
int main() {
int slots = 0;
int days = 1;
while (cin >> slots) {
cin.get();
vector<string> timeslots;
for (int i = 1; i <= slots; i++) {
string s; getline(cin, s);
timeslots.push_back(s);
}
cout << "Day #" << days++ << ": ";
solution(timeslots);
}
return 0;
}