programming-challenges Longest Nap (110404) 题解

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;
}


你可能感兴趣的:(Algorithm,C++)