http://acm.pku.edu.cn/JudgeOnline/problem?id=1215
Код:
#include <stdio.h> double charging[5][3] = { { 0.10, 0.06, 0.02 }, { 0.25, 0.15, 0.05 }, { 0.53, 0.33, 0.13 }, { 0.87, 0.47, 0.17 }, { 1.44, 0.80, 0.30 } }; int main ( void ) { char distance, number[8]; int start_time_m, end_time_m, start_time[2], end_time[2], output[3] = { 0, }, i, j; double result = 0; int value[4] = { 480, 1080, 1320, 1440 }, check; while ( 1 ) { scanf ( "%c", &distance ); if ( distance == '#' ) { break; } getchar(); scanf ( "%s", number ); scanf ( "%d %d %d %d", &start_time[0], &start_time[1], &end_time[0], &end_time[1] ); getchar (); start_time_m = start_time[0] * 60 + start_time[1]; end_time_m = end_time[0] * 60 + end_time[1]; if ( start_time_m == end_time_m ) { output[0] = 600; output[1] = 240; output[2] = 600; for ( i = 0 ; i < 3 ; i++ ) { j = distance - 65; result += charging[j][i] * output[i]; } printf("%10s%6d%6d%6d%3c%8.2f\n", number, output[0], output[1], output[2], distance, result ); continue; } check = 0; if ( end_time_m > start_time_m ) { if ( ( 480 <= start_time_m && start_time_m < 1080 ) && ( 480 <= end_time_m && end_time_m < 1080 ) ) { output[0] = end_time_m - start_time_m; check = 1; } else if ( ( 1080 <= start_time_m && start_time_m < 1320 ) && ( 1080 <= end_time_m && end_time_m < 3120 ) ) { output[1] = end_time_m - start_time_m; check = 1; } else if ( ( 1320 <= start_time_m && start_time_m < 1440 ) && ( 1320 <= end_time_m && end_time_m < 1440 ) ) { output[2] = end_time_m - start_time_m; check = 1; } else if ( ( 0 <= start_time_m && start_time_m < 480 ) && ( 0 <= end_time_m && end_time_m < 480 ) ) { output[2] = end_time_m - start_time_m; check = 1; } } if ( check == 1 ) { for ( i = 0 ; i < 3 ; i++ ) { j = distance - 65; result += charging[j][i] * output[i]; } printf("%10s%6d%6d%6d%3c%8.2f\n", number, output[0], output[1], output[2], distance, result ); output[0] = output[1] = output[2] = result = 0; continue; } for ( i = 0 ; i < 4 ; i++ ) { if ( start_time_m / value[i] != 0 ) { continue; } else { if ( i == 0 ) { output[2] = value[i] - start_time_m; } else { output[i-1] = value[i] - start_time_m; } break; } } if ( start_time_m > end_time_m ) { for ( j = i+1 ; j < 4 ; j++ ) { output[j-1] += value[j] - value[j-1]; } for ( i = 0 ; i < 4 ; i++ ) { if ( value[i] > end_time_m ) { if ( i == 0 ) { output[2] += end_time_m; break; } else { output[i-1] += end_time_m % value[i-1]; break; } } else { if ( i == 0 ) { output[2] += value[i]; } else { output[i-1] += value[i] - value[i-1]; } } } } else { for ( j = i+1 ; j < 4 ; j++ ) { if ( value[j] <= end_time_m ) { output[j-1] += value[j] - value[j-1]; } else { output[j-1] += end_time_m % value[j-1]; break; } } } for ( i = 0 ; i < 3 ; i++ ) { j = distance - 65; result += charging[j][i] * output[i]; } printf("%10s%6d%6d%6d%3c%8.2f\n", number, output[0], output[1], output[2], distance, result ); output[0] = output[1] = output[2] = result = 0; } return 0; }