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 }. ...
随机推荐
- 2-Harris角点检测
1. 何为角点? 下面有两幅不同视角的图像,通过找出对应的角点进行匹配. 再看下图所示,放大图像的两处角点区域: 我们可以直观的概括下角点所具有的特征: >轮廓之间的交点: >对于同一场景 ...
- 在ag-grid表格上实现类似Excel中的按下enter键自动跳转到下一行对应的输入框功能,Angular4开发
最近的项目使用ag-grid在Angular中处理表格,收到个需求是要能够同时修改大量的数据,按下Enter键的时候,光标得自动跳到下一行的对应列上. 方法一:用ag-grid自带的 enterMov ...
- 排序算法(三)堆排序及有界堆排序Java实现及分析
1.堆排序基数排序适用于大小有界的东西,除了他之外,还有一种你可能遇到的其它专用排序算法:有界堆排序.如果你在处理非常大的数据集,你想要得到前 10 个或者前k个元素,其中k远小于n,它是很有用的. ...
- C语言新手写扫雷攻略3
界面绘制好后,雷数也布置了,接下来就是游戏的运行过程了,今天先不说具体过程,再来看看需要用到的辅助函数 先是简单的画红旗,鼠标右键的功能是画红旗,至此我们都是在使用函数自己绘图,效率是低,但有助于理解 ...
- PAT 1010 Radix(X)
1010 Radix (25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = ...
- python3使用requests和requests_toolbelt上传文件
https://blog.csdn.net/summerpowerz/article/details/80293235 https://blog.csdn.net/lhh08hasee/article ...
- Maven项目上有小红叉咋办
Maven项目上有小红叉咋办 创建maven项目之后,war工程如果目录不全的话会出现错误.这种情况就是把目录补全就可以了. 这种情况版本问题,点击那个最新版本的,会自动给加一段代码.(如果没有就自己 ...
- 如何上传代码至GitHub
环境准备: git GitHub账号 步骤: 1.登录github创建一个新的项目 参数说明: Repository name: 仓库名称 Description(可选): 仓库描述介绍 Publi ...
- Codeforces 340B - Maximal Area Quadrilateral (计算几何)
Codeforces Round #198 (Div. 2) 题目链接:Maximal Area Quadrilateral Iahub has drawn a set of \(n\) points ...
- Git 学习第一天
本文是根据廖雪峰老师的git教程记录的学习笔记,特此说明,原教程链接https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c ...