Home >Web Front-end >HTML Tutorial >【TopCoder SRM 157 DIV 1】 Salary problem solving report_html/css_WEB-ITnose
I originally wanted to post the original title, but then I saw that it has copyright protection. I searched online and it seems that no one has posted the original title in the blog. To avoid trouble, I won’t copy it. The original question.
[Title idea]
The company pays employees wages based on wage yuan per hour. Employees punch in to record a time when they arrive at work, and record a time when they leave work. The time format is "hh:mm:ss". Among them, the overtime hours between 18:00:00 to 23:59:59 and 00:00:00 to 05:59:59 are counted as overtime, and the salary is 1.5 times. When calculating wages, minutes and seconds are converted into hours for calculation. The final wage is rounded up to an integer and subsequent decimals are discarded.
[Function format]
int howMuch(vector <string> arrival, vector <string> departure, int wage)
[Note]
arrival and departure elements have the same number, and arrival[0] [Problem-solving ideas] The idea is not difficult, but it is more troublesome to judge the time interval. There are two key time points: 06:00:00 and 18:00:00. [My Code]class Salary {public: int compareTime(int hh1, int mm1, int ss1, int hh2, int mm2, int ss2) { if (hh1 > hh2 || (hh1 == hh2 && mm1 > mm2) || (hh1 == hh2 && mm1 == mm2 && ss1 > ss2)) { return 1; } if (hh1 < hh2 || (hh1 == hh2 && mm1 < mm2) || (hh1 == hh2 && mm1 == mm2 && ss1 < ss2)) { return -1; } return 0; } double duringTime(int hh1, int mm1, int ss1, int hh2, int mm2, int ss2) { double time = 0; if (ss2 >= ss1) { time += (ss2 - ss1) / 3600.0; } else { time += (ss2 + 60 - ss1) / 3600.0; mm2 -= 1; } if (mm2 >= mm1) { time += (mm2 - mm1) / 60.0; } else { time += (mm2 + 60 - mm1) / 60.0; hh2 -= 1; } time += hh2 - hh1; return time; } int howMuch(vector <string> arrival, vector <string> departure, int wage) { int beginHour, endHour, beginMinute, endMinute, beginSecond, endSecond; stringstream ss; double total = 0; for (int i = 0; i < arrival.size(); i++) { string time1 = arrival[i]; ss.clear(); ss << time1.substr(0, 2); ss >> beginHour; ss.clear(); ss << time1.substr(3, 2); ss >> beginMinute; ss.clear(); ss << time1.substr(6, 2); ss >> beginSecond; string time2 = departure[i]; ss.clear(); ss << time2.substr(0, 2); ss >> endHour; ss.clear(); ss << time2.substr(3, 2); ss >> endMinute; ss.clear(); ss << time2.substr(6, 2); ss >> endSecond; if (compareTime(beginHour, beginMinute, beginSecond, 6, 0, 0) < 0) { if (compareTime(endHour, endMinute, endSecond, 6, 0, 0) < 0) { total += duringTime(beginHour, beginMinute, beginSecond, endHour, endMinute, endSecond) * wage * 1.5; } else if (compareTime(endHour, endMinute, endSecond, 6, 0, 0) >= 0 && compareTime(endHour, endMinute, endSecond, 18, 0, 0) < 0) { total += duringTime(beginHour, beginMinute, beginSecond, 6, 0, 0) * wage * 1.5; total += duringTime(6, 0, 0, endHour, endMinute, endSecond) * wage; } else if (compareTime(endHour, endMinute, endSecond, 18, 0, 0) >= 0) { total += duringTime(beginHour, beginMinute, beginSecond, 6, 0, 0) * wage * 1.5; total += duringTime(6, 0, 0, 18, 0, 0) * wage; total += duringTime(18, 0, 0, endHour, endMinute, endSecond) * wage * 1.5; } } else if (compareTime(beginHour, beginMinute, beginSecond, 18, 0, 0) < 0) { if (compareTime(endHour, endMinute, endSecond, 18, 0, 0) < 0) { total += duringTime(beginHour, beginMinute, beginSecond, endHour, endMinute, endSecond) * wage; } else if (compareTime(endHour, endMinute, endSecond, 18, 0, 0) >= 0) { total += duringTime(beginHour, beginMinute, beginSecond, 18, 0, 0) * wage; total += duringTime(18, 0, 0, endHour, endMinute, endSecond) * wage * 1.5; } } else { total += duringTime(beginHour, beginMinute, beginSecond, endHour, endMinute, endSecond) * wage * 1.5; } } return (int)total; }};
The first is to convert the string into an integer value of hours, minutes and seconds. The functions of the two custom functions are: compare two time points, mainly comparing with two key time points 06:00:00 and 18:00:00; calculate the number of hours between two time points.
Then there is a large section of logical judgment to determine whether the employee’s working hours are between 00:00:00 and 06:00:00, between 06:00:00 and 18:00:00, and between 18:00 and 18:00:00. Between 00:00 and 00:00:00, or across time periods.
Due to the poor foundation, the code is rather verbose. Everyone is welcome to improve.