1016 Phone Bills (25)(25 分)

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 n

o 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

将通话记录按照姓名、时间进行排序,进行遍历,当相邻两个记录姓名相同并且上一个记录为on-line,下一个记录为off-line时,才是有效的记录,然后将这些
数据 以姓名为键存放到map里。
当计算通话费用时,分别计算从第0天第0时第0分到开始时间和结束时间的费用,然后作差。
 #include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
using namespace std; struct Node
{
string name;
int d, h, m, time;
bool on_off;
}; int toll[];
bool cmp(Node a, Node b);
double billFromZero(Node a); int main()
{
int i, N, month;
string s;
Node node[];
for (i = ; i < ; i++)
{
cin >> toll[i];
toll[] += toll[i];
}
cin >> N;
for (i = ; i < N; i++)
{
cin >> node[i].name;
scanf_s("%d:%d:%d:%d", &month, &node[i].d, &node[i].h, &node[i].m);
node[i].time = ((node[i].d * ) + node[i].h) * + node[i].m;
cin >> s;
node[i].on_off = (s == "on-line") ? true : false;
}
sort(node, node + N, cmp);
map<string, vector<Node>> mapp;
for (i = ; i < N; i++)
{
if (node[i].name == node[i - ].name && !node[i].on_off && node[i - ].on_off)
{
mapp[node[i].name].push_back(node[i - ]);
mapp[node[i].name].push_back(node[i]);
}
}
for (auto it : mapp)
{
vector<Node> v = it.second;
cout << it.first;
printf(" %02d\n", month);
double t, sum = 0.0;
for (i = ; i < v.size(); i += )
{
printf("%02d:%02d:%02d %02d:%02d:%02d %d ", v[i - ].d, v[i - ].h, v[i - ].m, v[i].d, v[i].h, v[i].m, v[i].time - v[i - ].time);
t = billFromZero(v[i]) - billFromZero(v[i - ]);
printf("$%.2f\n", t);
sum += t;
}
printf("Total amount: $%.2f\n", sum);
}
return ;
} bool cmp(Node a, Node b)
{
return (a.name != b.name) ? (a.name < b.name) : (a.time < b.time);
} double billFromZero(Node a)
{
double sum = a.d * toll[] * + a.m * toll[a.h];
for (int i = ; i < a.h; i++)
sum += toll[i] * ;
return sum / ;
}
 

pat甲级1016的更多相关文章

  1. PAT甲级1016. Phone Bills

    PAT甲级1016. Phone Bills 题意: 长途电话公司按以下规定向客户收取费用: 长途电话费用每分钟一定数量,具体取决于通话时间.当客户开始连接长途电话时,将记录时间,并且客户挂断电话时也 ...

  2. PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)

    1016 Phone Bills (25 分)   A long-distance telephone company charges its customers by the following r ...

  3. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  4. 【转载】【PAT】PAT甲级题型分类整理

    最短路径 Emergency (25)-PAT甲级真题(Dijkstra算法) Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS) Travel P ...

  5. PAT甲级1131. Subway Map

    PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...

  6. PAT甲级1127. ZigZagging on a Tree

    PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...

  7. PAT甲级1123. Is It a Complete AVL Tree

    PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...

  8. PAT甲级1119. Pre- and Post-order Traversals

    PAT甲级1119. Pre- and Post-order Traversals 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二进制树可以通过给定的一对后序和顺序遍历序列来确定,也可以通 ...

  9. PAT甲级1114. Family Property

    PAT甲级1114. Family Property 题意: 这一次,你应该帮我们收集家族财产的数据.鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的 ...

随机推荐

  1. IPMITOOL 配置BMC用户设置

    IPMITOOL 配置BMC用户设置 本文档共介绍5条ipmi设置user的命令,这些命令需要使用root权限才能使用,其中- H为需要操作的BMC ip,-I lanplus为使用rmcp+协议发送 ...

  2. Ubuntu下Apache2+Tomact7安装、配置及整合

    安装Apache2 命令:apt-get install apache2 cd  /etc/apache2 打开apache.conf 加入 ServerName localhostDirectory ...

  3. Gson应用:从json格式简单字符串中获取value

    import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; i ...

  4. 【leetcode 968. 监控二叉树】解题报告

    解题思路: 由于叶子节点一定不要安装监视器,这样才能使总监视器数量比较少,因此需要从下往上进行判断当前节点的状态(共:3种状态): 0: 当前节点安装了监视器 1: 当前节点可观,但没有安装监视器 2 ...

  5. 三种Hash算法对比以及秒传原理.

    三种Hash算法对比以及秒传原理 CRC (32/64)   MD5  Sha1 分5个点来说 1.校验值长度 2.校验值类别 3.安全级别 4.应用场景 1).校验值长度 CRC(32/64) 分别 ...

  6. cf780E(dfs)

    题目链接: http://codeforces.com/problemset/problem/780/E 题意: 给出一个 n 个点 m 条边的图, 有 k 个人, 初始位置可以为任意位置, 每个人最 ...

  7. cf822D(质因子)

    题目链接: http://codeforces.com/problemset/problem/822/D 题意: 输入 t, l, r 求 t0·f(l) + t1·f(l + 1) + ... +  ...

  8. Pipenv: Python包管理神器

    Pipenv旨在将最好的包管理机制(bundler, composer, npm, cargo, yarn等等)带到Python中去. 它会为你的项目自动创建和管理virtualenv,也会在安装和移 ...

  9. day23作业详解

    1.题目 2.题目详解 点击查看详细内容 1. 1-1 封装 把功能封装到类中 class Message(object): def email(self):pass def msg(self):pa ...

  10. 20165224 陆艺杰 Exp7 网络欺诈防范

    通常在什么场景下容易受到DNS spoof攻击 一样的局域网环境下 在日常生活工作中如何防范以上两攻击方法 使用攻击检查工具 简单应用SET工具建立冒名网站  打开 apache服务 apache 是 ...