CPE 一顆星
題目連結:https://zerojudge.tw/ShowProblem?problemid=d089
內容
Gondwanaland Telecom這家電話公司收費的標準是以所撥電話的距離及時段來訂定的,如下表。在這裡charging step就是指不同的距離。
Charging Step | Day Rate | Evening Rate | Night Rate |
---|---|---|---|
A | 0.10 | 0.06 | 0.02 |
B | 0.25 | 0.15 | 0.05 |
C | 0.53 | 0.33 | 0.13 |
D | 0.87 | 0.47 | 0.17 |
E | 1.44 | 0.80 | 0.30 |
Day Rate = 8am to 6pm
Evening Rate = 6pm to 10pm
Night Rate = 10pm to 8am
所有的收費是根據該通電話每一分鐘多少錢來計算的,所以若有某通電話有跨時段,則按時段不同的收費標準分別計算在加總。例如:有一通電話從5:58pm開始到6:04pm結束,那前2分鐘是按白天(Day)的標準計費,而後4分鐘則按傍晚(Evening)的標準計費。
所有小於一分鐘的電話不列入計費,而且沒有一通電話會持續超過24小時。
每筆測資一列,分別代表 charging step(A~Z)、電話號碼、開始時間、結束時間。
輸入 # 代表結束。
輸出電話號碼、各時段通話分鐘數、charging step、總花費。
各部分輸出於一定位置,以靠右對齊來說,分別在10,16,22,28,31,39的位置。
範例輸入
C 765-7457 10 41 04 29
B 207-0225 21 28 07 53
B 316-0414 16 43 09 37
C 463-1401 19 28 00 33
D 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
想法
先將計費表用 map 儲存,並把時間分成如下7個部分,把每一部分的結束時間以陣列儲存。
0:00 ~ 8:00
8:00 ~ 18:00
18:00 ~ 22:00
22:00 ~ 8:00 (隔天)
8:00 ~ 18:00
18:00 ~ 22:00
22:00 ~ 24:00
將時間轉換成分鐘方便計算,若通話結束時間小於通話開始時間,則代表跨夜,需將其加上24小時(若兩者相等以通話24小時計算,不然UVA會WA)。
另開一陣列紀錄各個時間區間的通話分鐘數,接著就可以開始遍歷剛剛建立的儲存各個結束時間的陣列,判斷通話開始時間是否與結束時間在同一區間,若否,則紀錄此區間通話分鐘數,並更新通話開始時間為此區間結束時間。過程中可順便計算花費(通話分鐘數*計費表對應的價錢)。
最後將各區間通話分鐘數依照 Day, Evening, Night 區分即可。
輸出時可用 setw() 調整對齊。
參考資料:YUI HUANG 演算法學習筆記
程式碼
1 |
|