# Time Calculation# Greedy# Simulation

d089 - 00145 - Gondwanaland Telecom

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一個電信公司的計費標準,根據通話時間和距離(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";
	}
}

Discussion