行き詰ってます、助けてください。
あなたはアルバイトをしています。
給料は以下のルールで決まっています。
・9 時から 17 時まで : 時給 X 円 (通常の時給)
・17 時から 22 時まで : 時給 Y 円 (夜の時給)
・それ以外の時間 : 時給 Z 円 (深夜の時給)
あなたの N 日間の出勤時刻と退勤時刻が 1 時間単位で与えられます。
N 日間の合計で得られる金額を計算してください。
入力例 1 の場合、4 日間で時給 X 円、Y 円、Z 円となる時間帯を満遍なく働いており、
金額の合計は Z×9 + X×8 + Y×5 + Z×1 = 1500×9 + 1000×8 + 1300×5 + 1500×1 = 29500 円となります。
図1
入力される値
入力は以下のフォーマットで与えられます。
X Y Z
N
S_1 T_1
S_2 T_2
...
S_N T_N
・1 行目には、通常の時給 X、夜の時給 Y、深夜の時給 Z がこの順に整数で半角スペース区切りで与えられます。
・2 行目には、出勤日数 N が整数で与えられます。
・続く N 行の i 番目 (1 ≦ i ≦ N) には、i 日目の出勤時刻 S_i と退勤時刻 T_i がこの順に整数で半角スペース区切りで与えられます。
・入力は合計で N + 2 行となり、入力値最終行の末尾に改行が 1 つ入ります。
それぞれの値は文字列で標準入力から渡されます。標準入力からの値取得方法はこちらをご確認ください
期待する出力
・N 日間の給料の合計金額を整数で出力してください。
・末尾に改行を入れ、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。
・0 ≦ X, Y, Z ≦ 3,000
・1 ≦ N ≦ 100
・0 ≦ S < T ≦ 23
入力例1
1000 1300 1500
4
0 9
9 17
17 22
22 23
出力例1
29500
入力例2
1300 1500 1700
7
8 19
9 20
10 21
11 22
0 23
20 22
0 21
出力例2
130000
int getTotal(int s, int t, auto fn){
if(!(s<t)) return 0;
return fn(s) + getTotal(s+1, t, fn);
}
int main() {
int X,Y,Z;
int N;
cin>>X>>Y>>Z;
cin>>N;
auto func = [=](int s){
if(9 <= s && s < 17){
return X;
}else if(17 <= s && s < 22){
return Y;
}
return Z;
};
int total=0;
for(int i=0; i<N; i++){
int S,T;
cin>>S>>T;
total += getTotal(S, T, func);
}
cout<<total;
return 0;
}