ホームページ  >  記事  >  ウェブフロントエンド  >  【TopCoder SRM 157 DIV 1】給与問題解決レポート_html/css_WEB-ITnose

【TopCoder SRM 157 DIV 1】給与問題解決レポート_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:59:051297ブラウズ

元々は元の質問を投稿したかったのですが、ネットで検索したところ、元の質問をブログに投稿している人はいないようでした。トラブルを避けるため、元の質問はコピーしません。質問。

[タイトルのアイデア]

会社は、時間当たりの賃金元に基づいて従業員に賃金を支払います。時間の形式は「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 の間、または複数の期間にわたって。

基礎が不十分なため、コードは少し冗長になっています。改善していただければ幸いです。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。