立志用最少的代码做最高效的表达


PAT甲级最优题解——>传送门


A long-distance telephone company charges its customers by the following rules:

Making a long-distance call costs a certain amount per minute, depending on the time of day when the call is made. When a customer starts connecting a long-distance call, the time will be recorded, and so will be the time when the customer hangs up the phone. Every calendar month, a bill is sent to the customer for each minute called (at a rate determined by the time of day). Your job is to prepare the bills for each month, given a set of phone call records.

Input Specification:
Each input file contains one test case. Each case has two parts: the rate structure, and the phone call records.

The rate structure consists of a line with 24 non-negative integers denoting the toll (cents/minute) from 00:00 - 01:00, the toll from 01:00 - 02:00, and so on for each hour in the day.

The next line contains a positive number N (≤1000), followed by N lines of records. Each phone call record consists of the name of the customer (string of up to 20 characters without space), the time and date (MM:dd:HH:mm), and the word on-line or off-line.

For each test case, all dates will be within a single month. Each on-line record is paired with the chronologically next record for the same customer provided it is an off-line record. Any on-line records that are not paired with an off-line record are ignored, as are off-line records not paired with an on-line record. It is guaranteed that at least one call is well paired in the input. You may assume that no two records for the same customer have the same time. Times are recorded using a 24-hour clock.

Output Specification:
For each test case, you must print a phone bill for each customer.

Bills must be printed in alphabetical order of customers’ names. For each customer, first print in a line the name of the customer and the month of the bill in the format shown by the sample. Then for each time period of a call, print in one line the beginning and ending time and date (dd:HH:mm), the lasting time (in minute) and the charge of the call. The calls must be listed in chronological order. Finally, print the total charge for the month in the format shown by the sample.

Sample Input:
10 10 10 10 10 10 20 20 20 15 15 15 15 15 15 15 20 30 20 15 15 10 10 10
10
CYLL 01:01:06:01 on-line
CYLL 01:28:16:05 off-line
CYJJ 01:01:07:00 off-line
CYLL 01:01:08:03 off-line
CYJJ 01:01:05:59 on-line
aaa 01:01:01:03 on-line
aaa 01:02:00:01 on-line
CYLL 01:28:15:41 on-line
aaa 01:05:02:24 on-line
aaa 01:04:23:59 off-line

Sample Output:
CYJJ 01
01:05:59 01:07:00 61 $12.10
Total amount: $12.10
CYLL 01
01:06:01 01:08:03 122 $24.40
28:15:41 28:16:05 24 $3.85
Total amount: $28.25
aaa 01
02:00:01 04:23:59 4318 $638.80
Total amount: $638.80


注意

如果某一个人虽然有账单,但是没有找到有效的通话记录,这个人不予输出

输入的一天内各个小时段的话费单位是美分/分钟,所以在计算的时候一个小时的话费应该是60*price[i],另外输出费用要按美元计算,所以要除以100,不妨在输入一天内各个小时段的话费时就直接进行除以100的操作

输出月、日、时、分都必须有两位数字不够的要在高位补0


#include<bits/stdc++.h>
using namespace std;
struct Time{//定义时间类int month,day,hour,minute,time,online=0;//月日时分信息、距0日0时0分的分钟数、指明这一时间是online还是offlinebool operator <(const Time&t)const{//重载<运算符return this->time<t.time;}
};
double price[25];//存储一天内各个小时段的话费单位是美元/分钟
double compute(Time t,int day){//计算当前时间到day日0时0分所用话费double bill=0.0;for(int i=0;i<t.hour;++i)bill+=60*price[i];return bill+t.minute*price[t.hour]+price[24]*60*(t.day-day);
}
int main(){for(int i=0;i<24;++i){//读取一天内各个小时段的话费scanf("%lf",&price[i]);price[i]/=100.0;//化为美元price[24]+=price[i];}int N;scanf("%d",&N);map<string,set<Time>>bill;//存储每个人的名字和对应的话费时间for(int i=0;i<N;++i){//读取账单string s1,s2;Time t;cin>>s1;scanf("%d:%d:%d:%d",&t.month,&t.day,&t.hour,&t.minute);t.time=(t.day*24+t.hour)*60+t.minute;cin>>s2;if(s2=="on-line")t.online=1;bill[s1].insert(t);}for(auto i=bill.cbegin();i!=bill.cend();++i){//查找有效的话费记录并就算用时与话费并输出bool output=false;//该人的话费记录是否需要输出/是否有有效的话费记录double sumBill=0.0;//该人的话费总额for(auto j=(i->second).cbegin();j!=(i->second).cend();++j){//定义set的迭代器jauto jnext=j;//定义指向j指向的下一个对象的迭代器++jnext;for(;jnext!=(i->second).cend()&&!(j->online&&!jnext->online);++j,++jnext);//查找有效的话费记录if(jnext!=(i->second).cend()){//如果查找到了if(!output){//还没有输出过姓名的月份进行输出,并通过修改output变量标明该人的话费记录需要输出output=true;printf("%s %02d\n",(i->first).c_str(),j->month);}printf("%02d:%02d:%02d %02d:%02d:%02d ",j->day,j->hour,j->minute,jnext->day,jnext->hour,jnext->minute);//输出话费账单起止时间int t=jnext->time-j->time;//计算话费double bill=compute(*jnext,j->day)-compute(*j,j->day);//计算话费账单用时sumBill+=bill;//加到话费总额上printf("%d $%.2f\n",t,bill);//输出}}if(output)//如果该人的话费记录需要输出,输出话费总额printf("Total amount: $%.2f\n",sumBill);}return 0;
}

耗时


痛苦难道是白忍受的吗?它应该使我伟大!       ——托马斯 • 曼

【注意点分析】1016 Phone Bills (25 分)相关推荐

  1. PAT 1016 Phone Bills (25分) 逻辑较为复杂 sort() + map

    题目 A long-distance telephone company charges its customers by the following rules: Making a long-dis ...

  2. 1016 Phone Bills (25分)

    这个题相对复杂一点,读题用了20分钟,然后就是疯狂写代码,其实这个主要是计算费用复杂一点,其他倒是还好,第一遍提交有测试点1,2没过,回头看了一眼代码觉得计算不可能出错,然后一分析就是测试点1,2很显 ...

  3. 1016 Phone Bills (25 分) 【未完成】【难度: 中 / 知识点: 模拟】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805493648703488

  4. 1016 Phone Bills (25)(25 分)

    1 题目 2 解题思路 3 AC代码 4 总结 1 题目 A long-distance telephone company charges its customers by the followin ...

  5. 1016. Phone Bills (25)

    时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue 去掉非法数据计算账单 A long-distance telep ...

  6. 【测试点三、四、五分析】1032 Sharing (25 分)_28行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 To store English words, one method is to use linked lists and sto ...

  7. 【测试点分析】1010 Radix (25 分)_37行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Given a pair of positive integers, for example, 6 and 110, can th ...

  8. 7-14 电话聊天狂人 (25 分)map做法 + 详解 + 思路分析

    7-14 电话聊天狂人 (25 分)map做法 1:题目 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10 ​5 ​​ ),为通话记录条数.随后N行 ...

  9. 团体天梯 L2-030 冰岛人 (25 分)(思路、测试点分析)

    L2-030 冰岛人 (25 分) 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人 ...

最新文章

  1. Ant Design of Vue —— setFieldsValue方法 动态操作Switch组件
  2. 一定要树立真的猛的期刊,只需要发一篇的思路
  3. Life Cycle Stages of ASP.NET Web Page.
  4. 没事写着玩 系列之 JQ连连看(很丑陋,很初级)
  5. 网页爬虫的设计与实现(Java版)
  6. 程序员的算法课(18)-常用的图算法:广度优先(BFS)
  7. C语言fwrite()与Java writeFloat()数据转换
  8. mysql primary unique_MySQL中的INDEX,PRIMARY,UNIQUE,FULLTEXT之间的区别?
  9. 关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案
  10. CSS基础学习-10.CSS伸缩盒(老版本)
  11. webpack的学习
  12. K33 不是平面图_怎么用 PS 做景观平面图?
  13. DM笔记之安装1:DM7 For NeoKylin A6
  14. Egret引擎的常用倒计时
  15. 【独家】这两个人的对决,决定了万科股权大战的走向
  16. zoj 1239 Hanoi Tower Troubles Again! 题解Orz
  17. JS 小坑 - AJAX请求的小坑,请求接口404
  18. C#通过TCP实现 HL7医疗系统传输的协议,并使用MLLP协议发送HL7消息
  19. 活期存款利息的计算方法
  20. 微信小程序使用百度api获取天气信息 —— 微信小程序教程系列(16)

热门文章

  1. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
  2. scrapy框架的概念和流程
  3. Kafka科普系列 | 轻松理解Kafka中的延时操作
  4. 力扣- -231. 2的幂
  5. 美摄云非编系统——网页端实时编辑渲染方案
  6. LiveVideoStackCon讲师热身分享 ( 十一 ) —— 短视频APP的架构设计
  7. 腾讯物联网开发者社区平台Tencent Things Network发布 让IoT应用开发快速安全
  8. 从研究到应用:腾讯AI Lab的自然语言理解和生成
  9. PMP之项目风险管理---实施定性风险分析
  10. ffmpeg分解视频文件并加密