复建的第一题

理解题意

读懂题目就是一个活,所以我们用观察输出法,可以看出来月份,以及时间和费用之间的关系。

定义过程

然后时间要用什么来记录呢?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分)的更多相关文章

  1. PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)

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

  2. 1016 Phone Bills (25 分)

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

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

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

  4. 1016. Phone Bills (25)——PAT (Advanced Level) Practise

    题目信息: 1016. Phone Bills (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A l ...

  5. 1016. Phone Bills (25) -vector排序(sort函数)

    题目如下: A long-distance telephone company charges its customers by the following rules: Making a long- ...

  6. 1016 Phone Bills (25)(25 point(s))

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

  7. A1016 Phone Bills (25 分)

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

  8. PAT A 1016. Phone Bills (25)【模拟】

    题目:https://www.patest.cn/contests/pat-a-practise/1016 思路:用结构体存储,按照名字和日期排序,然后先判断是否有效,然后输出,时间加减直接暴力即可 ...

  9. 1016. Phone Bills (25)

    分析: 模拟题,提交无数次WA,注意几点: 1.如果某人没有有效通话记录,则不输出该人的信息,在此WA15次,题目看了N遍也没出现啊. 2.通话时间钱的计算:假设我们计算time1到time2的账单: ...

随机推荐

  1. 使用Retrofit上传图片

    Retrofit使用协程发送请求参考文章 :https://www.cnblogs.com/sw-code/p/14451921.html 导入依赖 app的build文件中加入: implement ...

  2. 解决Windows Server 2012 在VMware ESXi中经常自动断网问题

    最近一些开发人员反映他们使用的 Windows server2012 R2 虚拟机过段时间就远程连接不上了,ping也不通(已关闭防火墙),我们登录ESXi发现,Windows Server 的网络图 ...

  3. Hive源码上手及问题解决

    一.编译准备 1.下载源码包 https://github.com/apache/hive/archive/refs/tags/rel/release-2.3.7.zip 或使用git直接拉取 无法解 ...

  4. Django基础07篇 ORM操作

    1.新增(类似数据库操作的insert) # 新增 #方式一: models.Category.objects.create(name='MySQL') #方式二: c = models.Catego ...

  5. PYTHON 当前.PY文件名不能与引入的模块同名

    当前文件名:sqlite3.py 文件引入import sqlite3 运行会出错,因为调用sqlite3的方法首先从当前文件找方法,当然找不到,所以会报错了

  6. redis反向代理docker容器中的rabbit mq服务

    最近做的项目中用到了docker,发现docker容器还真挺好用的,可以统一来管理各种资源,项目. 但是在实际使用中就碰到下面这个问题(下面所有的应用都是在docker中启动的): 通过nginx来反 ...

  7. Windows内核驱动--实现修改线程优先级demo

    在User下修改优先级比较麻烦,该驱动可以直接用线程ID,和优先级级数两个参数直接修改线程的优先级: Client代码: #include <Windows.h> #include < ...

  8. 【Mysql】一个简易的索引方案

    一.没有索引的时候如何查找 先忽略掉索引这个概念,如果现在直接要查某条记录,要如何查找呢? 在一个页中查找 如果表中的记录很少,一个页就够放,那么这时候有 2 种情况: 用主键为搜索条件:这时就是之前 ...

  9. springboot-6-springSecurity

    一.Spring Security的基本配置 安全需要在设计网站之初就需要做好设计 可以做到: 功能权限 访问权限 菜单权限 这些权限虽然用拦截器过滤器也能实现,但是很麻烦,所以我们一般使用框架实现 ...

  10. odoo14学习----x2many操作与图片设置继承image.mixin

    三种方式实现数据更新 一,如上所述 二,通过对数据集调用update({'key':value,'key1':value1..})更新数据集 三,调用write函数,与update类似,传递字典.   ...