A1016 Phone Bills (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 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
1.没有配对的用户不能输出(测试点3)。needPrint
2.名字必须相同(测试点2)。rec[j].name==rec[j+1].name
#include<bits/stdc++.h>
using namespace std; const int maxn=100010; struct Record{
string name;
int month;
int day;
int hh;
int mm;
int flag;
string status;
}; Record rec[maxn]; int rate[24];
int n; bool cmp(Record a,Record b){
if(a.name!=b.name)
return a.name<b.name;
else if(a.month!=b.month)
return a.month<b.month;
else if(a.day!=b.day)
return a.day<b.day;
else if(a.hh!=b.hh)
return a.hh<b.hh;
else
return a.mm<b.mm; } void print(){
for(int i=0;i<n;i++){
cout<<rec[i].name<<" "<<rec[i].month<<":"<<rec[i].day<<":"<<rec[i].hh<<":"<<rec[i].mm
<<" "<<rec[i].status<<" "<<rec[i].flag<<endl;
}
} int Calculate(int dd1,int hh1,int mm1,int dd2,int hh2,int mm2,int& count){
int money=0; while(dd1<dd2||hh1<hh2||mm1<mm2){ count++; mm1++; money+=rate[hh1]; if(mm1==60){
hh1++;
mm1=0;
} if(hh1==24){
dd1++;
hh1=0;
} } return money; } int main(){ for(int i=0;i<24;i++)
cin>>rate[i]; cin>>n; char c; Record temp; for(int i=0;i<n;i++){
cin>>temp.name>>temp.month>>c>>temp.day>>c>>temp.hh>>c>>temp.mm
>>temp.status; if(temp.status=="on-line")
temp.flag=1;
else
temp.flag=2; rec[i]=temp; } sort(rec,rec+n,cmp); // print(); // int count1=0;
// int money1=Calculate(rec[7].day,rec[7].hh,rec[7].mm,rec[8].day,rec[8].hh,rec[8].mm,count1); // cout<<count1<<" "<<money1<<endl; int left=0,right=0; while(left<n){ while(right<n&&rec[left].name==rec[right].name)
right++; if(right!=n-1)
right--; bool needPrint=false; for(int j=left;j<right;j++){
if(rec[j].flag==1&&rec[j+1].flag==2&&rec[j].name==rec[j+1].name){
needPrint=true;
break;
} } if(needPrint){
cout<<rec[left].name<<" ";
printf("%02d\n",rec[left].month);
}else{
left=right+1;
right=left;
continue;
} double total=0; for(int i=left;i<=right-1;i++){
if(rec[i].flag==1&&rec[i+1].flag==2&&rec[i].name==rec[i+1].name){ int money=0,count=0; money=Calculate(rec[i].day,rec[i].hh,rec[i].mm,
rec[i+1].day,rec[i+1].hh,rec[i+1].mm,count); total+=money; printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",rec[i].day,rec[i].hh,rec[i].mm,
rec[i+1].day,rec[i+1].hh,rec[i+1].mm,count,(double)money/100.0); }
} printf("Total amount: $%.2f\n",total/100.0); left=right+1;
right=left; } return 0;
}
A1016 Phone Bills (25 分)的更多相关文章
- A1016 Phone Bills (25)(25 分)
A1016 Phone Bills (25)(25 分) A long-distance telephone company charges its customers by the followin ...
- PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)
1016 Phone Bills (25 分) A long-distance telephone company charges its customers by the following r ...
- PAT A1016 Phone Bills (25)
题目描述 A long-distance telephone company charges its customers by the following rules: Making a long-d ...
- 1016 Phone Bills (25 分)
A long-distance telephone company charges its customers by the following rules: Making a long-distan ...
- 1016 Phone Bills (25分)
复建的第一题 理解题意 读懂题目就是一个活,所以我们用观察输出法,可以看出来月份,以及时间和费用之间的关系. 定义过程 然后时间要用什么来记录呢?day hour minute 好麻烦呀..用字符串吧 ...
- 【PAT甲级】1016 Phone Bills (25 分)(结构体排序)
题意: 输入24个正整数代表从0到23每个小时通话一分钟花费的美分.输入一个正整数N(<=1000),然后输入N组字符串,每个字符串包含客户的名字和通话的时刻以及打出或者挂断的状态. 按照字典序 ...
- 1016 Phone Bills (25 分)
1016 Phone Bills (25 分) A long-distance telephone company charges its customers by the following rul ...
- PTA - - 06-图1 列出连通集 (25分)
06-图1 列出连通集 (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发, ...
- 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)
01-复杂度2 Maximum Subsequence Sum (25分) Given a sequence of K integers { N1,N2, ..., NK }. ...
随机推荐
- Linux shell脚本编程if语句的使用方法(条件判断)
if 语句格式if 条件then Commandelse Commandfi 别忘了这个结尾If语句忘了结尾fitest.sh: line 14: syntax error: unex ...
- STL lower_bound upper_bound 用法
1.lower_bound(begin,end,x) 返回第一个>=x的位置,找不到return .end() 2.upper_bound (begin,end,x) 返回第一个>x的位置 ...
- LInux多线程编程----线程特定数据的处理函数
1.pthread_key_t和pthread_key_create() 线程中特有的线程存储, Thread Specific Data .线程存储有什么用了?他是什么意思了?大家都知道,在多线程程 ...
- thinkphp5.1调用七牛云SDK上传文件
thinkphp5.0 class Upload { public static function image(){ if(empty($_FILES['file']['tmp_name'])){ e ...
- socket模拟通信
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java ...
- Openstack组件部署 — Nova_安装和配置Controller Node
目录 目录 前文列表 Prerequisites 先决条件 To create the databases To create the service credentials Create the C ...
- ajax中的onload和readychange区别
先补个知识点: readyState 状态码: 0:请求未初始化 1:服务器连接已建立 2:请求已接受 3:请求处理中 4:请求已完成,且响应已就绪 HTTP 状态码: 200 - 服务器成功返回网页 ...
- Centos 能ping通域名和公网ip但是网站不能够打开,服务器拒绝了请求。打开80端口解决。
博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/10/29/centos-%E8%83%BDping%E9%80%9A%E5%9F%9F%E ...
- 分享一套主流框架源码资料,征服阿里 P7 面试必备!
2019年已经过完一半了, 我在这里为大家准备了一份资料,征服阿里 P7 面试必备! 希望这些资料可以帮助到大家,从一个码农进阶为一个优秀的程序员,也可以帮大家提升系统实战能力. 这些资料包括: 讲解 ...
- 从零开始 Code Review,两年实战经验分享!
作者:wenhx http://www.cnblogs.com/wenhx/p/5641766.html 前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展 Cod ...