首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

UVA 145 Gondwanaland Telecom 題解:通話費用計算與時段費率邊界處理

     編輯:C++ 入門

題目大意

根據距離等級(A-E)和一天三個時段(日 8:00-18:00,晚 18:00-22:00,夜 22:00-8:00)計算通話費。費率表給定。通話跨時段按各段分鐘數分別計費。不足 1 分鐘不計費,最長不超 24 小時。輸入格式:等級 號碼 起始時 分 結束時 分。單行 # 結束。輸出:號碼 日分鐘 晚分鐘 夜分鐘 等級 總費用(格式固定)。

關鍵難點

  1. 跨午夜處理:若結束時間 ≤ 開始時間,視為跨天,分兩段累加(開始到 24:00,0:00 到結束)。
  2. 開始=結束視為 24 小時:此情況需完整累加 1440 分鐘。
  3. 時段邊界:8:00(480)、18:00(1080)、22:00(1320) 分鐘刻度。

算法

將時間轉換為分鐘數 S, E。若 S < E 遍歷 [S+1, E];若 S == E 遍歷 [S+1, 1440] 和 [1, E];若 S > E 同 S==E。每分鐘根據所在時段累加對應費率,並統計三時段分鐘數。最後按格式輸出。

AC 代碼 (C++)

#include <iostream>
#include <cstdio>
using namespace std;
struct Rate { char step; double day, eve, nig; };
Rate r[5] = {
    {'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}
};
inline double getPrice(int minute, int idx, int &d, int &e, int &n) {
    if (minute <= 480) { n++; return r[idx].nig; }
    if (minute <= 1080) { d++; return r[idx].day; }
    if (minute <= 1320) { e++; return r[idx].eve; }
    { n++; return r[idx].nig; }
}
int main() {
    char step, num[10];
    int sh, sm, eh, em;
    while (scanf(" %c", &step), step != '#') {
        scanf("%s %d %d %d %d", num, &sh, &sm, &eh, &em);
        int idx=0; while(r[idx].step!=step) idx++;
        int S=sh*60+sm, E=eh*60+em;
        int d=0, ev=0, n=0; double cost=0;
        if (S < E) {
            for(int i=S+1;i<=E;i++) cost+=getPrice(i,idx,d,ev,n);
        } else {
            for(int i=S+1;i<=1440;i++) cost+=getPrice(i,idx,d,ev,n);
            for(int i=1;i<=E;i++) cost+=getPrice(i,idx,d,ev,n);
        }
        printf("%10s%6d%6d%6d%3c%8.2lf\n", num, d, ev, n, step, cost);
    }
    return 0;
}

格式說明

%10s 右對齊號碼,%6d 三時段分鐘右對齊,%3c 等級,%8.2lf 費用保留兩位小數右對齊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved