d089 - 00145 - Gondwanaland Telecom
題目描述
題目描述了一個電信公司的計費標準,根據通話時間和距離(charging step)計算費用。需要讀取多筆通話記錄,計算每通電話在白天、傍晚和夜晚分別通話了多少分鐘,並計算總費用。
解題思路
程式碼模擬了通話過程,計算通話在不同時段的持續時間。首先,將通話開始和結束時間轉換成分鐘數。然後,使用迴圈模擬每一分鐘的通話,判斷該分鐘屬於哪個時段(白天、傍晚或夜晚),並更新對應時段的通話分鐘數。最後,根據充電步驟和各時段的通話分鐘數計算總費用。
複雜度分析
- 時間複雜度: O(T * M),其中 T 是測試案例的數量,M 是通話持續的分鐘數。在最壞的情況下,M 可以接近 1440 分鐘(一天)。
- 空間複雜度: O(1),程式碼使用的空間是固定的,不隨輸入大小變化。
程式碼
#include <iostream>
#include <iomanip>
using namespace std;
int x,y,xx,yy;
string s;
double d[5][3]={{0.1,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.8,0.3}};
char ch;
int main(){
cin.tie(0); ios::sync_with_stdio(false);
while(cin >> ch){
if(ch=='#')break;
cin >> s >> x >> y >> xx >> yy;
y+=x*60;
yy+=xx*60;
int a=0,b=0,c=0,st=0;
double v=0;
while(y!=yy||st==0){
++y;
st=1;
if(y>=1440)y-=1440;
if(y>480&&y<=1080){
++a;
}
else if(y>1080&&y<=1320){
++b;
}
else{
++c;
}
}
v=d[ch-'A'][0]*a+d[ch-'A'][1]*b+d[ch-'A'][2]*c;
cout << setw(10) << s << setw(6) << a << setw(6) << b << setw(6) << c << setw(3) << ch << setw(8) << fixed << setprecision(2) << v << "\n";
}
}