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 分)的更多相关文章

  1. A1016 Phone Bills (25)(25 分)

    A1016 Phone Bills (25)(25 分) A long-distance telephone company charges its customers by the followin ...

  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 A1016 Phone Bills (25)

    题目描述 A long-distance telephone company charges its customers by the following rules: Making a long-d ...

  4. 1016 Phone Bills (25 分)

    A long-distance telephone company charges its customers by the following rules: Making a long-distan ...

  5. 1016 Phone Bills (25分)

    复建的第一题 理解题意 读懂题目就是一个活,所以我们用观察输出法,可以看出来月份,以及时间和费用之间的关系. 定义过程 然后时间要用什么来记录呢?day hour minute 好麻烦呀..用字符串吧 ...

  6. 【PAT甲级】1016 Phone Bills (25 分)(结构体排序)

    题意: 输入24个正整数代表从0到23每个小时通话一分钟花费的美分.输入一个正整数N(<=1000),然后输入N组字符串,每个字符串包含客户的名字和通话的时刻以及打出或者挂断的状态. 按照字典序 ...

  7. 1016 Phone Bills (25 分)

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

  8. PTA - - 06-图1 列出连通集 (25分)

    06-图1 列出连通集   (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发, ...

  9. 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)

    01-复杂度2 Maximum Subsequence Sum   (25分) Given a sequence of K integers { N​1​​,N​2​​, ..., N​K​​ }. ...

随机推荐

  1. A*启发式搜索基础

    A*启发式搜索基础 传统的搜索方式是盲目搜索,即到每一步的时候并没有对每种情况进行有效的区分,这样的结果是浪费了大量的时间,对很多没有必要的数据进行了搜索. 而A*算法则在搜索的过程中会选取认为“最优 ...

  2. Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  3. hive UDAF开发和运行全过程

    介绍 hive的用户自定义聚合函数(UDAF)是一个很好的功能,集成了先进的数据处理.hive有两种UDAF:简单和通用.顾名思义,简单的UDAF,写的相当简单的,但因为使用Java反射导致性能损失, ...

  4. 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集

    机器学习 数据挖掘 数据集划分 训练集 验证集 测试集 Q:如何将数据集划分为测试数据集和训练数据集? A:three ways: 1.像sklearn一样,提供一个将数据集切分成训练集和测试集的函数 ...

  5. 2017年上半年,一线城市豪宅TOP50成交均价排名

    辣眼睛!最新豪宅排行榜来了!释放重磅信号 东方财富网 2017-07-27 08:47 阅读:152 摘要:在中国,在买房这个问题上,不少工薪族都感到亚历山大.但是,在富豪眼里,犯难的是投资哪个房地产 ...

  6. 多图上传控制器及模型代码(2)thinkphp5+layui实现多图上传保存到数据库,可以实现图片自由排序,自由删除。

    公共css代码 <style> .layui-upload-img { width: 90px; height: 90px; margin: 0; } .pic-more { width: ...

  7. appium无法定位连接的真机元素

    报错信息: com.android.ddmlib.SyncException:Remote object dosen't exist! 解决办法: 错误原因是因为没有dump下来界面的信息保存到uid ...

  8. 高级UI晋升之常用View(三)中篇

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从ViewPager来介绍常用View:文章目录 一.简介 二.基本使用 ...

  9. python调用tushare获取A股周线行情

    接口:weekly 描述:获取A股周线行情 限量:单次最大3700,总量不限制 积分:用户需要至少300积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare模块下载和安装教程,请查阅我 ...

  10. 随笔-ansible-6

    Ansible中的变量引用有时候需要双引号,有时候不需要双引号,这是因为Ansible是多人协作的作品,所以没有统一. 一切以官网说明为主,同时自己也要实践. 这是一个example.yml文件,我们 ...