ホームページ > 記事 > ウェブフロントエンド > 【TopCoder SRM 157 DIV 1】給与問題解決レポート_html/css_WEB-ITnose
元々は元の質問を投稿したかったのですが、ネットで検索したところ、元の質問をブログに投稿している人はいないようでした。トラブルを避けるため、元の質問はコピーしません。質問。
[タイトルのアイデア]
会社は、時間当たりの賃金元に基づいて従業員に賃金を支払います。時間の形式は「hh:mm:ss」です。このうち、18時00分00秒~23時59分59秒と0時00分00秒~05時59分59秒の時間帯は時間外労働とみなされ、給与は1.5倍となります。賃金を計算する場合、分と秒は時間に変換されて計算されます。最終賃金は整数に切り上げられ、小数点以下は切り捨てられます。
【関数形式】
int howMuch(vector <string> arrival, vector <string> departure, int wage)
【注意】
到着は出発と同じ要素数を持ち、到着[0]<出発[0]<到着[1]<出発[1] 』など。
[問題解決のアイデア]
アイデアは難しくありませんが、時間間隔を判断するのがより困難です。 06:00:00 と 18:00:00 の 2 つの重要な時間ポイントがあります。
【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; }};まず、文字列を時、分、秒の整数値に変換します。 2 つのカスタム関数の機能は次のとおりです。2 つの時点を比較し、主に 2 つの主要な時点 06:00:00 と 18:00:00 を比較します。2 つの時点の間の時間数を計算します。
その後、論理的判断の大部分が実行され、従業員の勤務時間が 00:00:00 から 06:00:00 の間、06:00:00 から 18:00:00 の間、および 18:00 の間であるかどうかが決定されます。 :00 と 18:00:00 の間、または複数の期間にわたって。
基礎が不十分なため、コードは少し冗長になっています。改善していただければ幸いです。