题目

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


题解

首先判断是否成对,最后还是用到了map。
成对的话,上线要在下线前。这边上下线用staus记录。加在结构体里。
每组测试数据,所有日期在同一个月,故记录时间时考虑day,hour,min。

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct customer{string name;int month,day,hour,min,time,status;//考虑好哪些因素,比如cost和total不在结构体里
};
bool cmp(customer a,customer b){return a.name==b.name?a.time<b.time:a.name<b.name;
}double count(customer call,int *cost){double total=cost[call.hour]*call.min+call.day*cost[24]*60;for(int i=0;i<call.hour;i++){total+=cost[i]*60;}return total/100.0;
}
int main(){int cost[25]={0};for(int i=0;i<24;i++){scanf("%d",&cost[i]);cost[24]+=cost[i];}int n;scanf("%d",&n);vector<customer> cus(n);for(int i=0;i<n;i++){//不能数据类型分开输入cin>>cus[i].name;scanf("%02d:%02d:%02d:%02d",&cus[i].month,&cus[i].day,&cus[i].hour,&cus[i].min);string temp;cin>>temp;cus[i].status=(temp=="on-line")?1:0;//这样可以少用if了//因为date的数据都在里面,可以顺便算个通话时间,后面是用挂电话分钟数-接电话分钟数cus[i].time=cus[i].day*24*60+cus[i].hour*60+cus[i].min;}sort(cus.begin(),cus.end(),cmp);map<string,vector<customer>> result;for(int i=1;i<n;i++){if(cus[i].name==cus[i-1].name&&cus[i-1].status==1&&cus[i].status==0){result[cus[i-1].name].push_back(cus[i-1]);result[cus[i].name].push_back(cus[i]);}}// 输出for(auto it:result){// vector auto::iterator it;vector<customer> temp=it.second;//加入map的倒入新的vector遍历完准备输出//printf(*it.first);cout<<it.first;printf(" %02d\n",temp[0].month);double total=0.0;for(int i=1;i<temp.size();i+=2){double t=count(temp[i],cost)-count(temp[i-1],cost);printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",temp[i-1].day,temp[i-1].hour,temp[i-1].min,temp[i].day,temp[i].hour,temp[i].min,temp[i].time-temp[i-1].time,t);total+=t;}printf("Total amount: $%.2f\n",total);}return 0;
}

本题最重要的是两个vector和一个map的运用,map也可以象有序容器一样push_back。
还有双重排序,先排名字,再按名字排时间。
这题犯了不少错。比如输入输出格式:%02d老写成02%d。
最致命的错就是,当输入字符串时,最好用cin格式,用scanf显示段错误。
多加注意!

PAT甲级1016 (map,排序)相关推荐

  1. PAT甲级1016 Phone Bills :[C++题解]字符串处理(复杂题)(C语言格式化读入、输出很便利!!!)

    文章目录 题目分析 题目链接 题目分析 原题: 长途电话公司按以下规则向客户收费: 拨打长途电话每分钟要花费一定的费用,具体收费取决于拨打电话的时间. 客户开始拨打长途电话的时间将被记录,客户挂断电话 ...

  2. PAT甲级 1016 Phone Bills(时间差)

    Link 题意: 远程电话的收费是按照每分钟来计费的,现在告诉你一天24小时中每分钟的收费标准,以及n条通话记录,试求出每个人该月的消费账单. 只有开始记录没有结束记录的通话不计费,反之亦然.保证所有 ...

  3. PAT 甲级 1016

    读题: the rate structure, and the phone call records 24个价格,不同时间段内 (分/秒) 输出格式按照姓名和日期排序,开始编码没有注意到姓名排序,做了 ...

  4. PAT甲级1022 map、set的使用

    题目 A Digital Library contains millions of books, stored according to their titles, authors, key word ...

  5. PAT甲级1054 map的使用

    题目 1054 The Dominant Color(20 分) Behind the scenes in the computer's memory, color is always talked ...

  6. 【PAT甲级 vector string排序】1047 Student List for Course (25 分) 含别人的做法

    题目 样例输出 1 4 ANN0 BOB5 JAY9 LOR6 2 7 ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6 3 1 BOB5 4 7 BOB5 DON2 FRA8 J ...

  7. PAT甲级1083 List Grades:[C++题解]结构体、排序

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 结构体存下来所有信息.根据成绩存入vector,然后排序输出即可. ac代码 #include<bits/stdc++.h&g ...

  8. PAT甲级1153 Decode Registration Card of PAT :[C++题解]结构体、哈希表、排序、类似数据库查询题、好题

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 本题是三种不同的询问,难道要写三个结构体?想了想,就写了一个结构体,参赛人结构体,内容包括考号id和成绩grade,然后开结构体数组 ...

  9. PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:和下面这题是一道题: PAT甲级1137 Final Grading:[C++题解]结构体.排序.哈希表.结构体构造函数.结构体内写函 ...

最新文章

  1. 1.13.、1.14.Flink 支持的DataType和序列化、Flink Broadcast Accumulators Counters Distributed Cache
  2. pythonssl双向认证_Python 上的 ssl 提示验证失败,有什么办法深究具体失败的原因么?...
  3. Asp程序做页面的301跳转,使得cnasda.com跳转到www.cnasda.com
  4. 与Spring的计划任务一起按时运行
  5. 02.Mybatis的动态代理方式实现增删改查
  6. python union函数_如何掌握Python union()方法及怎么用?
  7. icmp消息类型报告传输_ICMP消息的类型和ICMP消息格式
  8. Linux安装Java
  9. 通俗理解滑模变结构(2)
  10. iBatis.Net系列(五)-providers.config-
  11. python中的数据存储-json
  12. DevOps原则,听伍道长细细道来
  13. 星际大战(飞机游戏系列)
  14. [转载] 晓说——第24期:“看美国”系列之人类精华犹太人(下)
  15. Y05 - 999、Python - 风变编程
  16. 使用filter()方法进行数据过滤
  17. 【语义分割】综述——一文搞定语义分割
  18. camel动态设置路由执行
  19. 小学教师资格证计算机知识,小学老师教师资格证复习内容是什么 小学教师资格证考试笔试必备知识点...
  20. python 黑魔法_Python “黑魔法” 之 Meta Classes

热门文章

  1. 做图软件matlab,Matlab 生物节律作图软件
  2. C++程序员应该掌握的东西
  3. 【入门篇】Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布
  4. Axure-----三级下拉菜单的具体实现过程
  5. 94. Ext.MessageBox消息框
  6. 回到顶部 jquery
  7. Unix网络编程 chart
  8. Class.forName()、Class.forName().newInstance() 、New 三者区别!
  9. lucene(全文搜索)_建立索引_根据关键字全文搜索_源码下载
  10. 网管系统开发经验谈(二)