news 2026/4/16 16:45:02

UVa 145 Gondwanaland Telecom

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 145 Gondwanaland Telecom

题目描述

Gondwanaland Telecom \texttt{Gondwanaland Telecom}Gondwanaland Telecom公司根据通话距离和一天中的时间段对电话呼叫进行计费。计费依据如下费率表,其中计费步长与距离相关:

计费步长(距离)白天费率(8 : 00 − 18 : 00 8:00-18:008:0018:00晚间费率(18 : 00 − 22 : 00 18:00-22:0018:0022:00夜间费率(22 : 00 − 8 : 00 22:00-8:0022:008:00
A AA0.10 0.100.100.06 0.060.060.02 0.020.02
B BB0.25 0.250.250.15 0.150.150.05 0.050.05
C CC0.53 0.530.530.33 0.330.330.13 0.130.13
D DD0.87 0.870.870.47 0.470.470.17 0.170.17
E EE1.44 1.441.440.80 0.800.800.30 0.300.30

所有费率均为每分钟通话的费用(美元)。跨越不同费率时段的通话,将按照在各时段内实际通话时间分别计费。例如,一个通话从下午5 : 58 5:585:58开始,到下午6 : 04 6:046:04结束,将按2 22分钟白天费率和4 44分钟晚间费率计费。通话时间不足一分钟不记录,且任何通话不会超过24 2424小时。

编写一个程序,读取通话详情,计算相应费用。

输入格式

输入每行包含:计费步长(大写字母AE)、被叫号码(7 77位数字和连字符组成的字符串,格式规范)、通话开始和结束时间,各部分之间恰好由一个空格分隔。时间以24 2424小时制的小时和分钟表示,小时和分钟之间用一个空格分隔,每个数字为两位。输入以单独一行包含一个#结束。

输出格式

输出包含:被叫号码、通话在各计费类别中的分钟数、计费步长和总费用,格式如下所示。

注意:下面示例输出的第一行并非实际输出内容,仅用于展示所需的制表格式。

示例输入:

A 183-5724 17 58 18 04 #

示例输出:

183-5724 2 4 0 A 0.44

题目分析与解题思路

本题的核心在于时间段的划分与累加计算。我们需要将一个通话的时长,按照三个不同的费率时段(白天、晚间、夜间)进行拆分,然后根据给定的距离费率步长(A AAE EE)计算总费用。

关键点分析

  1. 时间处理
    题目给出的时间是24 2424小时制,但通话可能跨越午夜(例如从23 : 50 23:5023:5000 : 10 00:1000:10)。为了简化处理,我们可以将时间全部转换为00 : 00 00:0000:00开始的分钟数。这样,通话的起始时间和结束时间就可以表示为一个整数(分钟数)。

  2. 跨天通话
    如果结束时间小于开始时间,说明通话跨越了午夜,需要将结束时间加上1440 14401440分钟(一天的总分钟数)。此外,题目明确说明“通话不会超过24 2424小时”,且如果开始时间等于结束时间,则视为通话24 2424小时(即加上1440 14401440分钟)。

  3. 费率时段划分
    一天中的费率时段如下:

    • 白天:08 : 00 − 18 : 00 08:00 - 18:0008:0018:00(分钟数:480 480480-1079 10791079
    • 晚间:18 : 00 − 22 : 00 18:00 - 22:0018:0022:00(分钟数:1080 10801080-1319 13191319
    • 夜间:22 : 00 − 08 : 00 22:00 - 08:0022:0008:00(分钟数:1320 13201320-1439 143914390 00-479 479479

    由于通话可能跨越午夜,我们需要考虑两天的时段。因此,我们可以将时段扩展为两个24 2424小时周期,即0 002880 28802880分钟。

  4. 计算各时段通话分钟数
    我们需要计算在扩展后的时间段(从s t a r t M i n startMinstartMine n d M i n endMinendMin)内,落在每个费率时段的总分钟数。可以通过一个辅助函数getAnd来计算两个时间段的交集分钟数,并注意通话分钟数应减去1 11(因为通话的“分钟”是从开始时刻起算的整数分钟,例如从5 : 58 5:585:586 : 04 6:046:04,实际计费分钟为2 224 44,而非3 335 55)。

算法步骤

  1. 读入一行数据,若为#则结束。
  2. 将开始和结束时间转换为从00 : 00 00:0000:00开始的分钟数。
  3. 处理跨天情况:
    • 若结束时间小于开始时间,或两者相等,则结束时间加上1440 14401440分钟。
  4. 定义三个变量分别记录白天、晚间、夜间的总分钟数。
  5. 通过getAnd函数计算在扩展后的时间段内,与各费率时段(考虑两个周期)的交集分钟数,并累加。
  6. 根据距离步长(A − E A-EAE)和对应的费率表计算总费用。
  7. 按格式输出结果。

时间复杂度

每个通话的处理时间主要花费在getAnd函数的循环上,最坏情况下需要遍历2880 28802880分钟,因此时间复杂度为O ( 2880 ) = O ( 1 ) O(2880) = O(1)O(2880)=O(1),对于题目给定的输入规模非常高效。

代码实现

// Gondwanaland Telecom// UVa ID: 145// Verdict: Accepted// Submission Date: 2016-01-22// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net//// In description: "Calls less than a minute are not recorded and no call// may last more than 24 hours. "// I miss the case of whole 24 hours! (start time == end time)#include<bits/stdc++.h>usingnamespacestd;intgetAnd(intstart1,intend1,intstart2,intend2){intminutes=0;for(inti=start1;i<=end1;i++)if(i>=start2&&i<=end2)minutes++;return(minutes>0?(minutes-1):0);}intmain(){string line,distance,number;intstartHour,startMin,endHour,endMin;doublecost[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}};while(getline(cin,line),line!="#"){istringstreamiss(line);iss>>distance>>number>>startHour>>startMin>>endHour>>endMin;startMin+=startHour*60;endMin+=endHour*60;if(endHour<startHour)endMin+=1440;elseif(endHour==startHour&&endMin<startMin)endMin+=1440;elseif(endHour==startHour&&endMin==startMin)endMin+=1440;doubletotalCost=0.0;intdayMin=0,eveningMin=0,nightMin=0;dayMin+=getAnd(startMin,endMin,480,1080);dayMin+=getAnd(startMin,endMin,1920,2520);eveningMin+=getAnd(startMin,endMin,1080,1320);eveningMin+=getAnd(startMin,endMin,2520,2760);nightMin+=getAnd(startMin,endMin,0,480);nightMin+=getAnd(startMin,endMin,1320,1920);nightMin+=getAnd(startMin,endMin,2760,2880);totalCost+=dayMin*cost[distance[0]-'A'][0];totalCost+=eveningMin*cost[distance[0]-'A'][1];totalCost+=nightMin*cost[distance[0]-'A'][2];cout<<setw(10)<<right<<number;cout<<setw(6)<<right<<dayMin;cout<<setw(6)<<right<<eveningMin;cout<<setw(6)<<right<<nightMin;cout<<setw(3)<<right<<distance;cout<<setw(8)<<right<<fixed<<setprecision(2)<<totalCost<<endl;}return0;}

总结

本题是一道典型的时间计算类模拟题,难点在于正确处理跨天通话和各费率时段的划分。通过将时间统一转换为分钟数,并扩展为两个周期来处理跨午夜的通话,可以大大简化计算逻辑。代码实现中需要注意边界条件,特别是开始时间等于结束时间的情况,应视为24 2424小时通话。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 13:29:50

学术新伙伴:百考通AI如何重塑你的文献综述写作体验

在硕士研究的征程中&#xff0c;文献综述往往被视为第一道真正的学术试炼。它要求研究者不仅要有广博的阅读积累&#xff0c;更需要具备清晰的逻辑梳理能力和深刻的学术洞察力。然而现实情况是&#xff0c;许多同学尽管投入了大量时间阅读文献&#xff0c;却依然在组织与写作环…

作者头像 李华
网站建设 2026/4/16 16:19:20

C++ MD5 算法实现原理

一&#xff1a;概述 MD5算法是一种广泛使用的哈希函数&#xff0c;可生成 128位哈希值。MD5 由Ronald Rivest于 1991 年设计&#xff0c;用于取代早期的哈希函数MD4。MD5 算法是把任意长度的字节流 → 通过固定的非线性函数 位运算 → 压缩成 128 bit 状态。 MD5 可作为校验和…

作者头像 李华
网站建设 2026/4/16 15:34:40

Spring Boot定时任务实战:让代码像闹钟一样准时工作!

文章目录 一、Spring Boot定时任务基础&#xff1a;从"闹钟"到"智能日历"1.1 启用定时任务功能1.2 创建你的第一个定时任务 二、多种调度方式详解&#xff1a;选择合适的"时间管理器"2.1 fixedRate&#xff1a;固定频率执行2.2 fixedDelay&#…

作者头像 李华