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;

}