2011-06-15 07:40:44Morris

d089. 145 - Gondwanaland Telecom

http://zerojudge.tw/ShowProblem?problemid=d089

內容 :

Gondwanaland Telecom這家電話公司收費的標準是以所撥電話的距離及時段來訂定的,如下表。在這裡charging step就是指不同的距離。

所有的收費是根據該通電話每一分鐘多少錢來計算的,所以若有某通電話有跨時段,則按時段不同的收費標準分別計算在加總。例如:有一通電話從5:58pm開始到6:04pm結束,那前2分鐘是按白天(Day)的標準計費,而後4分鐘則按傍晚(Evening)的標準計費。

所有小於一分鐘的電話不列入計費,而且沒有一通電話會持續超過24小時。

輸入說明 :

每筆測試資料一列,代表某通電話的通話記錄。每列輸入資料包含6個部分,第一個部分為charging step(大寫字母A~E)。第二個部分為所撥的電話號碼(為7個數字及一個"-"的字串),第三、四個部分代表通話開始的時間:時及分。第五、六個部分代表通話結束的時間:時及分(均以24小時的時鐘來看,時、分均以2個數字來表現)。

若輸入列的第一個字為#,代表輸入結束。請參考Sample Input

輸出說明 :

對每一筆測試資料輸出一列,也包含6個部分。

第一個部分為所撥的電話號碼。第二、三、四部分分別代表這通電話所用各時段(Day,Evening,Night)的分鐘數,第五個部分為charging setp,第六個部分為這通電話總共計費多少錢。

各部分輸出於一定位置,以靠右對其來說,分別在10,16,22,28,31,39的位置。請參考Sample Output

範例輸入 :

C 765-7457 10 41 04 29B 207-0225 21 28 07 53B 316-0414 16 43 09 37C 463-1401 19 28 00 33D 514-9373 01 20 09 08#

範例輸出 :

  765-7457   439   240   389  C  362.44  207-0225     0    32   593  B   34.45  316-0414   174   240   600  B  109.50  463-1401     0   152   153  C   70.05  514-9373    68     0   400  D  127.16

提示 :

* 中文翻譯:Lucky 貓

出處 :

Uva ACM 145 (管理:MAPLEWING)



作法 : 模擬
終於用到
switch() {
   case A...B :
}
真好用=]

#include<stdio.h>
#include<stdlib.h>
float charge[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}
                     };
main() {
    char stop[2], phone[10];
    int sh, sm, eh, em, C = 0;
    while(scanf("%s", stop) == 1 && stop[0] != '#') {
        scanf("%s %d %d %d %d", phone, &sh, &sm, &eh, &em);
        int D = 0, E = 0, N = 0, ssum, esum, a;
        if(eh < sh || (eh == sh && em <= sm)) eh += 24;
        ssum = sh * 60 + sm;
        esum = eh * 60 + em;
        for(a = 0; a <= 2880; a++) {
            if(a > ssum && a <= esum) {
                switch(a) {
                    case    0 ...  480: N++;break;
                    case  481 ... 1080: D++;break;
                    case 1081 ... 1320: E++;break;
                    case 1321 ... 1920: N++;break;
                    case 1921 ... 2520: D++;break;
                    case 2521 ... 2760: E++;break;
                    case 2761 ... 3360: N++;break;
                }
            }
        }
        double price = D*charge[stop[0]-'A'][0] +
                         E*charge[stop[0]-'A'][1] +
                             N*charge[stop[0]-'A'][2];
        printf("%10s%6d%6d%6d%3s%8.2lf\n", phone, D, E, N, stop, price);
    }
    return 0;
}