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
 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef struct{
char id[];
int m, dd, hh, mm;
int on_line;
}info;
int N, rates[];
bool cmp(info a, info b){
if(strcmp(a.id, b.id) < )
return true;
else if(strcmp(a.id, b.id) == && a.m < b.m)
return true;
else if(strcmp(a.id, b.id) == && a.m == b.m && a.dd < b.dd)
return true;
else if(strcmp(a.id, b.id) == && a.m == b.m && a.dd == b.dd && a.hh < b.hh)
return true;
else if(strcmp(a.id, b.id) == && a.m == b.m && a.dd == b.dd && a.hh == b.hh && a.mm < b.mm)
return true;
else return false;
}
double counts(info a, info b, int &length){
double sum = ;
length = ;
while(a.dd < b.dd || a.hh < b.hh || a.mm < b.mm){
sum += rates[a.hh];
a.mm++;
length++;
if(a.mm == ){
a.mm = ;
a.hh++;
}
if(a.hh == ){
a.hh = ;
a.dd++;
}
}
return sum;
}
int main(){
info records[];
char id[] = {'\0'}, states[];
for(int i = ; i < ; i++)
scanf("%d", &rates[i]);
scanf("%d", &N);
for(int i = ; i < N; i++){
scanf("%s %d:%d:%d:%d %s", records[i].id, &records[i].m, &records[i].dd, &records[i].hh, &records[i].mm, states);
if(strcmp(states, "on-line") == )
records[i].on_line = ;
else
records[i].on_line = ;
}
sort(records, records + N, cmp);
int prt = , length;
double charge = , temp;
for(int i = ; i < N - ; i++){
if(strcmp(records[i].id, records[i + ].id) == && records[i].on_line == && records[i + ].on_line == ){
if(prt == ){
printf("%s %02d\n", records[i].id, records[i].m);
prt = ;
}
temp = counts(records[i], records[i + ], length) / ;
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n", records[i].dd, records[i].hh, records[i].mm, records[i + ].dd, records[i + ].hh, records[i + ].mm, length, temp);
charge += temp;
}else if(strcmp(records[i].id, records[i + ].id) != ){
if(prt == ){
printf("Total amount: $%.2f\n", charge);
}
charge = ;
prt = ;
}
}
if(prt == ){
printf("Total amount: $%.2f", charge);
}
cin >> N;
return ;
}

总结:

1、本题的要求是,对同一个用户,先对无序的记录按照时间排序,只有两条紧邻的且前者为on-line后者为off-line的记录才视作有效记录,对这些有效记录作一些统计,并输出。

2、首先采用struct记录每个时间节点的信息。为了方便后续处理,对这些信息进行排序,相同的人的信息在一起,且同一个人的信息按时间顺序排列。如果是自己写排序算法,则可采用具有稳定性的排序算法进行两次排序,第一次按照时间顺序,第二次按照人名的字典序。如果采用c++自带sort函数,在自定义比较函数cmp时,a与b的大小定义为:如果a的id小于b的id,则a<b, id相等则比较时间,a的时间小于b的时间,则a<b。

3、在计算单次通话时长和通话费用时,可以采用之前的日期计算的套路,从小日期往大日期累加1,过程中不断注意进制。循环进行的条件为 a.dd < b.dd || a.hh < b.hh || a.mm < b.mm, 因为a时间大于等于b时间是 a.dd >= b.dd && a.hh >= b.hh && a.mm >= b.mm。

4、在做这道题的时候还遇到一个问题,在count函数加了一个引用传参时,编译器报错,百思不得其解。网上查了之后才知道std里有count函数模板,与我定义的count有冲突,改掉名字之后成功编译。

5、double变量,输入时为%lf, 输出时为%f。

A1016. Phone Bills的更多相关文章

  1. A1016 Phone Bills (25)(25 分)

    A1016 Phone Bills (25)(25 分) A long-distance telephone company charges its customers by the followin ...

  2. PAT A1016 Phone Bills (25 分)——排序,时序

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

  3. PAT A1016 Phone Bills (25)

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

  4. A1016 Phone Bills (25 分)

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

  5. PAT甲级——A1016 Phone Bills

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

  6. PTA A1016

    A1016 Phone Bills (25 分) 题目内容 A long-distance telephone company charges its customers by the followi ...

  7. PAT_A1016#Phone Bills

    Source: PAT A1016 Phone Bills (25 分) Description: A long-distance telephone company charges its cust ...

  8. PAT题目AC汇总(待补全)

    题目AC汇总 甲级AC PAT A1001 A+B Format (20 分) PAT A1002 A+B for Polynomials(25) PAT A1005 Spell It Right ( ...

  9. 【算法学习记录-排序题】【PAT A1016】Phone Bills

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

随机推荐

  1. Ionic 中控件点击延迟的处理

    原文发表于我的技术博客 本文分享了在 Ionic 中如何处理控件点击延迟的问题. 原文发表于我的技术博客 1. 问题描述 在 Ionic 中,当在 iOS 环境下运行元素的点击事件时,你会发现点击响应 ...

  2. Centos6.9下安装并使用VNC的操作记录

    VNC是一个的"远程桌面"工具.,通常用于“图形界面”的方式登录服务器,可视化操作.废话不多说了,操作记录如下: 1)安装桌面环境 [root@vm01 ~]# yum -y gr ...

  3. 浏览器数据库 IndexedDB 入门

    一.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的 ...

  4. D. Boxes Packing

    链接 [http://codeforces.com/contest/1066/problem/D] 题意 题目大意 n个物品m个篮子每个篮子容量为k 每个物品重量为a[i] 问能装多少物品 这个人是强 ...

  5. VS2013安装和单元测试

    1. VC2013安装过程及使用感受 刚上大一的时候老师推荐我们用VC++6.0.当时也就听了老师的话用VC++6.0编程了一段时间.后来上了大二买了电脑VC++6.0支持不了WIN8.1所以我就开始 ...

  6. Week 3 结对编程

    Group: 杜正远 潘礼鹏 结对编程: 优点: 集体荣誉感.你们已经是一个集体了,一定得为对方着想负责. 1.看对方的代码,彼此会互相学习到一些奇妙的方法. 2.结对编程能把两个事情分开,降低复杂度 ...

  7. Maximal Binary Matrix CodeForces - 803A (贪心+实现)

    题目链接 题意有点坑: 给你一个N*N的矩阵,让你填入K个1,使之整个矩阵关于左上到右下的对角线对称,并且这个要求这个矩阵的字典序最大. 对矩阵的字典序的定义是从每一行的第一个元素开始比较,大着为字典 ...

  8. Beta阶段敏捷冲刺二

    一.举行站立式会议 1.当天站立式会议照片一张 2.团队成员报告 林楚虹 (1) 昨天已完成的工作:连接上数据库 (2) 今天计划完成的工作:修改学习界面单词获取 (3) 工作中遇到的困难:虽然前天询 ...

  9. JavaScript表单验证登录

    在登录时,通常是将输入的信息原封不动的传送给后端的处理程序,然后处理之后返回结果,那么可能后端服务器的压力就很大,所以可以先在提交表单之前进行一些简单的检测,然后再发给后端,减小服务器的一部分压力: ...

  10. JsTree使用一例

    SearchDesignPatent.treeContainer().jstree({ 'core' : { 'data' : json.data }, }).bind('click.jstree', ...