1016 Phone Bills (25)(25 point(s))
problem
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
tip
- 考察对STL库的熟悉情况的模拟题。
answer
#include<bits/stdc++.h>
using namespace std;
#define Max 1010
#define INF 0x3f3f3f3f
#define fi first
#define se second
int rate[25], N;
typedef struct {
float bill;
int minutes;
string begin, end;
}Call;
typedef struct{
string time, tip, name;
}Time;
typedef struct {
vector<Time> temp;
vector<Call> calls;
float sum;
}Data;
Data D[1010];
map<string, Data> M;
map<string, Data>::iterator IT;
int month[12] = {0, 31};
bool OnOff(string tip){
return tip.size() == 7 ? true : false;
}
int TranTime(string t) {
int day, hour, minute;
day = (t[3]-'0')*10 + t[4]-'0';
hour = (t[6]-'0')*10 + t[7]-'0';
minute = (t[9]-'0')*10 + t[10] -'0';
return (day-1)*24*60 + hour*60 + minute;
}
float CalBill(string t){
int oneDay = 0;
int sum = 0;
for(int i = 0; i < 24; i++){
oneDay += rate[i]*60;
}
int day, hour, minute;
day = (t[3]-'0')*10 + t[4]-'0';
hour = (t[6]-'0')*10 + t[7]-'0';
minute = (t[9]-'0')*10 + t[10] -'0';
sum += day*oneDay;
for(int i = 0; i < hour; i++)
{
sum += rate[i]*60;
}
sum += rate[hour]*minute;
return (float)sum/100.0;
}
bool Comp(Time a, Time b){
return a.time < b.time;
}
int main (){
// freopen("test.txt", "r", stdin);
ios::sync_with_stdio(false);
for(int i = 0; i < 24; i++){
cin>>rate[i];
}
cin>>N;
for(int i = 0; i < N; i++) {
string name, time, tip;
cin>>name>>time>>tip;
Time t;
t.name = name;
t.time = time;
t.tip = tip;
M[t.name].temp.push_back(t);
}
for(IT = M.begin(); IT != M.end(); IT++){
sort(IT->second.temp.begin(), IT->second.temp.end(), Comp);
vector<Time> a = IT->se.temp;
stack <Time> sta;
Call call;
// cout<<IT->first<<" "<< a[0].time.substr(0,2)<<endl;
for(int i = 0; i < IT->se.temp.size(); i++){
if(OnOff(a[i].tip)){
sta.push(a[i]);
}else{
if(sta.empty()) continue;
call.begin = sta.top().time;
call.end = a[i].time;
call.minutes = TranTime(call.end) - TranTime(call.begin);
call.bill = CalBill(call.end) - CalBill(call.begin);
// cout<<call.begin.substr(3,10)<<" "<<call.end.substr(3, 10)<<" "<<call.minutes<<" $"<<fixed<<setprecision(2)<<call.bill<<endl;
IT->se.calls.push_back(call);
IT->second.sum += call.bill;
while(!sta.empty()) sta.pop();
}
}
// cout<<"Total amount: $"<<fixed<<setprecision(2)<<IT->se.sum<<endl;
}
for(IT = M.begin(); IT != M.end(); IT++){
vector<Time> a = IT->se.temp;
if(IT->se.calls.size() == 0) continue;
cout<<IT->first<<" "<< a[0].time.substr(0,2)<<endl;
for(int i = 0; i < IT->se.calls.size(); i++){
Call call = IT->se.calls[i];
cout<<call.begin.substr(3,10)<<" "<<call.end.substr(3, 10)<<" "<<call.minutes<<" $"<<fixed<<setprecision(2)<<call.bill<<endl;
}
cout<<"Total amount: $"<<fixed<<setprecision(2)<<IT->se.sum<<endl;
}
return 0;
}
exprience
- 模拟题,小心配对错误,与无配对的情况。即是边界条件的考虑。
1016 Phone Bills (25)(25 point(s))的更多相关文章
- A1016 Phone Bills (25)(25 分)
A1016 Phone Bills (25)(25 分) A long-distance telephone company charges its customers by the followin ...
- MySQL5.7.25(解压版)Windows下详细的安装过程
大家好,我是浅墨竹染,以下是MySQL5.7.25(解压版)Windows下详细的安装过程 1.首先下载MySQL 推荐去官网上下载MySQL,如果不想找,那么下面就是: Windows32位地址:点 ...
- PAT 甲级 1006 Sign In and Sign Out (25)(25 分)
1006 Sign In and Sign Out (25)(25 分) At the beginning of every day, the first person who signs in th ...
- 【PAT】1020 Tree Traversals (25)(25 分)
1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...
- 【PAT】1052 Linked List Sorting (25)(25 分)
1052 Linked List Sorting (25)(25 分) A linked list consists of a series of structures, which are not ...
- 【PAT】1060 Are They Equal (25)(25 分)
1060 Are They Equal (25)(25 分) If a machine can save only 3 significant digits, the float numbers 12 ...
- 【PAT】1032 Sharing (25)(25 分)
1032 Sharing (25)(25 分) To store English words, one method is to use linked lists and store a word l ...
- 【PAT】1015 德才论 (25)(25 分)
1015 德才论 (25)(25 分) 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得 ...
- 1003 Emergency (25)(25 point(s))
problem 1003 Emergency (25)(25 point(s)) As an emergency rescue team leader of a city, you are given ...
- 1002 A+B for Polynomials (25)(25 point(s))
problem 1002 A+B for Polynomials (25)(25 point(s)) This time, you are supposed to find A+B where A a ...
随机推荐
- OI,再见
SDOI2016 因为自己的沙茶犯了低级的沙茶错误而滚粗. day2原可以AK,却因为眼残脑残只拿到90. 由此可见,细节永远不是一个小问题. 想想过去的日子,还真是舍不得. 但过去的终将过去,未来的 ...
- sklearn_k均值聚类
# 机器学习之k均值聚类 # coding:utf-8 import sklearn.datasets as datasets from sklearn.cluster import KMeans i ...
- Android笔记之开机自启
有时候需要应用具有开机自启的能力,或者更常见的场景是开机时悄悄在后台启动一个Service. 关键点: 1. Android系统在开机的时候会发送一条广播消息,只需要接收这条广播消息即可,不过需要注意 ...
- Python概念-定制自己的数据类型(包装)
包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均 ...
- 【HASPDOG】Communication error
靠,防火墙没关,关了防火墙生成文件成功
- git clone直接提交用户名和密码
git使用用户名密码clone的方式: git clone http://username:password@remote 例如:我的用户名是abc@qq.com,密码是abc123456,git地址 ...
- ajax局部刷新后里面的jquery事件失效的解决方法
live() 与bind()作用基本一样. 最重要区别:live()可以将事件绑定到当前和将来的元素(eg:为id=zy元素绑定点击事件,而当你用js动态生成一个节点并插入到dom文档结构中时,如果你 ...
- Python爬虫---requests库快速上手
一.requests库简介 requests是Python的一个HTTP相关的库 requests安装: pip install requests 二.GET请求 import requests # ...
- Spring入门实例
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. 控制反转:应 ...
- java基础63 JavaScript中的Number、Math、String、Date对象(网页知识)
本文知识点(目录): 1.Number对象 2.Math对象 3.String对象 4.Date对象 (日历例子) 1.Number对象 1.1.Number对象的创建方式 方式1: ...