pat甲级1016
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.25aaa 0102: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的更多相关文章
- PAT甲级1016. Phone Bills
		
PAT甲级1016. Phone Bills 题意: 长途电话公司按以下规定向客户收取费用: 长途电话费用每分钟一定数量,具体取决于通话时间.当客户开始连接长途电话时,将记录时间,并且客户挂断电话时也 ...
 - PAT 甲级 1016 Phone Bills (25 分)  (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)
		
1016 Phone Bills (25 分) A long-distance telephone company charges its customers by the following r ...
 - PAT甲级题解(慢慢刷中)
		
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...
 - 【转载】【PAT】PAT甲级题型分类整理
		
最短路径 Emergency (25)-PAT甲级真题(Dijkstra算法) Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS) Travel P ...
 - PAT甲级1131. Subway Map
		
PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...
 - PAT甲级1127. ZigZagging on a Tree
		
PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...
 - PAT甲级1123. Is It a Complete AVL Tree
		
PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...
 - PAT甲级1119. Pre- and Post-order Traversals
		
PAT甲级1119. Pre- and Post-order Traversals 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二进制树可以通过给定的一对后序和顺序遍历序列来确定,也可以通 ...
 - PAT甲级1114. Family Property
		
PAT甲级1114. Family Property 题意: 这一次,你应该帮我们收集家族财产的数据.鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的 ...
 
随机推荐
- Redis常见7种使用场景(PHP)
			
转发:https://www.jianshu.com/p/2f3add45351b Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并 ...
 - MYSQL MYSQLI PDO
			
PHP的MySQL扩展(优缺点) 设计开发允许PHP应用与MySQL数据库交互的早期扩展.mysql扩展提供了一个面向过程 的接口: 并且是针对MySQL4.1.3或更早版本设计的.因此,这个扩展虽然 ...
 - 2018CCPC网络赛A(优先队列,思维)
			
#include<bits/stdc++.h>using namespace std;priority_queue<pair<int,int>>q;int main ...
 - c语言数组相关的计算
			
1.数组的创建:元素类型 数组名 [常量或者常量表达式] 如:int arr1[10];注:即使是被const修饰的变量也不能作为[]中的内容,它本质上依然属于变量,只是具有常量属性2.数组的初始化: ...
 - 为什么要把系统拆分成分布式的,为啥要用Dubbo?
			
阅读本文大概需要 6 分钟. 作者:yanglbme 1.面试题 为什么要进行系统拆分?如何进行系统拆分?拆分后不用 dubbo 可以吗? 2.面试官心里分析 从这个问题开始就进行分布式系统环节了,好 ...
 - has been blocked by CORS policy: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response.
			
https://www.cnblogs.com/caimuqing/p/6733405.html // TODO 支持跨域访问 response.setHeader("Access-Cont ...
 - 关于强大的requests
			
存到文件: with open(filename, 'wb') as fd: for chunk in r.iter_content(chunk_size): fd.write(chunk) 使用 R ...
 - Repair 暴力
			
Description standard input/outputStatements Alex is repairing his country house. He has a rectangula ...
 - Java面向对象_对象数组
			
今天学习了对象数组,写点东西总结一下.废话不多说,啥是对象数组呢? 对象数组的概念是这么讲的,对象数组就是数组里的每个元素都是类的对象,赋值时先定义对象,然后将对象直接赋给数组. 举个例子,使用对象数 ...
 - Java面向对象_适配器模式
			
概念:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 public class Practice14 { public static v ...