1016 Phone Bills (25分)
复建的第一题
理解题意
读懂题目就是一个活,所以我们用观察输出法,可以看出来月份,以及时间和费用之间的关系。
定义过程
然后时间要用什么来记录呢?day hour minute 好麻烦呀。。用字符串吧也可以比较大小的
看到这种结果分组的(就像是数据库里面group by之后的结果)就想到用map<string,xxx>
在这道题里面,xxx就是个容器里面存放了打电话挂电话的时间戳,
这个时间戳应该是用结构体的定义,首先需要是电话或者挂电话的时间点,还有这个时间点转化为的数字,以及状态。
题意延展
下一个难点就是计算费用,这里是参考别人的,利用打表的方式,把每分钟的费用给计算出来,这样再根据时间戳就可以减出整个对话长度的话费。
具体操作
剩下的就简单了,就是录入数据排下去,然后按每个人头(name)处理一下。<name,vector<record>> first second
这里遍历就是auto,vector<record>一层的遍历是要两个两个遍历(这里是这个题的特色,因为他要求人在同一个时间段不可能有两个通话,所以以排序为主,出现的两个相邻而且是一个on一个end的就是我们要的区间,合法的区间)
输出要求
根据输出,我们可以看到,当这个人开始第1次输出的时候,要输出他的名字以及月份,后面要跟上话费以及最后要输出总话费,所以我可以通过话费来判断是否是输出名字还是输出时间条目。
ac代码

1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1000,M=24*60,minuteOfAMonth=31*M+10;
4 struct record{
5 int minute;
6 string formatTime;
7 string state;
8 };
9 bool cmp(record a,record b){
10 return a.minute<b.minute;
11 }
12 map<string,vector<record>> records;
13 double sum[minuteOfAMonth];
14 int money[25];
15 int main(){
16 int n;
17 for(int i=0;i<24;i++) cin>>money[i];
18 for(int i=1;i<minuteOfAMonth;i++)sum[i]=sum[i-1]+money[(i-1)%M/60]/100.0;
19 cin>>n;
20 int month,day,hour,minute;
21 char name[25],state[10],formatTime[25];
22 for(int i=0;i<n;i++){
23 scanf("%s %d:%d:%d:%d %s",name,&month,&day,&hour,&minute,state);
24 int minutes=(day-1)*M+60*hour+minute;
25 sprintf(formatTime,"%02d:%02d:%02d",day,hour,minute);
26 records[name].push_back({minutes,formatTime,state});
27 }
28 for(auto a:records){
29 double total=0;
30 string name=a.first;
31 auto person=a.second;
32 sort(person.begin(),person.end(),cmp);
33 for(int i=0;i+1<person.size();i++){
34 auto a=person[i],b=person[i+1];
35 if(a.state=="on-line"&&b.state=="off-line"){
36 if(!total){
37 printf("%s %02d\n",name.c_str(),month);
38 }
39 double charge=sum[b.minute]-sum[a.minute];
40 printf("%s %s %d $%.2lf\n",a.formatTime.c_str(),b.formatTime.c_str(),b.minute-a.minute,charge);
41 total+=charge;
42 }
43 }
44 if(total)printf("Total amount: $%.2lf\n",total);
45 }
46
47 }
新知
ps:sprintf真的灵性,学到了。可以这样构建字符串。
sprintf(a,"%02d",name);//name以%02d的格式输入到a中。
1016 Phone Bills (25分)的更多相关文章
- PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)
1016 Phone Bills (25 分) A long-distance telephone company charges its customers by the following r ...
- 1016 Phone Bills (25 分)
A long-distance telephone company charges its customers by the following rules: Making a long-distan ...
- 【PAT甲级】1016 Phone Bills (25 分)(结构体排序)
题意: 输入24个正整数代表从0到23每个小时通话一分钟花费的美分.输入一个正整数N(<=1000),然后输入N组字符串,每个字符串包含客户的名字和通话的时刻以及打出或者挂断的状态. 按照字典序 ...
- 1016. Phone Bills (25)——PAT (Advanced Level) Practise
题目信息: 1016. Phone Bills (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A l ...
- 1016. Phone Bills (25) -vector排序(sort函数)
题目如下: A long-distance telephone company charges its customers by the following rules: Making a long- ...
- 1016 Phone Bills (25)(25 point(s))
problem A long-distance telephone company charges its customers by the following rules: Making a lon ...
- A1016 Phone Bills (25 分)
A long-distance telephone company charges its customers by the following rules: Making a long-distan ...
- PAT A 1016. Phone Bills (25)【模拟】
题目:https://www.patest.cn/contests/pat-a-practise/1016 思路:用结构体存储,按照名字和日期排序,然后先判断是否有效,然后输出,时间加减直接暴力即可 ...
- 1016. Phone Bills (25)
分析: 模拟题,提交无数次WA,注意几点: 1.如果某人没有有效通话记录,则不输出该人的信息,在此WA15次,题目看了N遍也没出现啊. 2.通话时间钱的计算:假设我们计算time1到time2的账单: ...
随机推荐
- 大数据-Hadoop虚拟机的准备以及配置(三台机子)
虚拟机的准备 修改静态IP(克隆的虚拟机) vim /etc/udev/rules.d/70-persistent-net.rules 配置网络: Vim /etc/sysconfig/network ...
- mysql 更换主键
p.p1 { margin: 0; font: 12px "Helvetica Neue" } span.s1 { font: 12px ".PingFang SC&qu ...
- WPF教程十二:了解自定义控件的基础和自定义无外观控件
这一篇本来想先写风格主题,主题切换.自定义配套的样式.但是最近加班.搬家.新租的房子打扫卫生,我家宝宝6月中旬要出生协调各种的事情,导致了最近精神状态不是很好,又没有看到我比较喜欢的主题风格去模仿的, ...
- 新旧图号(图幅号)转换/计算/检查,经纬度转换计算,C#代码
图号(图幅号):地图图号是指为便于使用和管理,按照一定方法将各分幅地图进行的编号. 经常用到图号,但是在网上一直没有找到一个完整的图号转换程序,因此自己写了一个图号处理的库,分享出来.如有错误请指正. ...
- ctf之SusCTF2017-Caesar cipher
由题目名字SusCTF2017-Caesar cipher可知,该题目考察凯撒密码. 直接下载附件打开如图 由题目描述可知,提交的flag格式为Susctf{}.在网上搜索在凯撒密码解密. 偏移量为3 ...
- 获取操作系统OS等相关信息
问题一:Windows SDK 8.1版本中的VersionHelper.h文件当中没有IsWindows10ORGreater,所以当你用IsWindows8Point1ORGreater判断出版本 ...
- C语言:const详解
希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小.为了满足这一要求,可以使用const关键字对变量加以限定:const in ...
- Spring Boot 2.x基础教程:使用Elastic Job实现定时任务
上一篇,我们介绍了如何使用Spring Boot自带的@Scheduled注解实现定时任务.文末也提及了这种方式的局限性.当在集群环境下的时候,如果任务的执行或操作依赖一些共享资源的话,就会存在竞争关 ...
- 拿来-util工具函数
记录一些写的好的工具函数.以便学习和项目中直接拿来使用. 判断值是否相等:使用于任何数据类型:基本数据类型和复杂深层次对象 function deepEqual (a, b) { if (a === ...
- 就想搞明白,component-scan 是怎么把Bean都注册到Spring容器的!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 忒复杂,没等搞明白大促都过去了! 你经历过618和双11吗?你加入过大促时候那么多复 ...