复建的第一题

理解题意

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

定义过程

然后时间要用什么来记录呢?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中。

最新文章

  1. Win10桌面预览版14316更新内容大全
  2. 机器学习 1 linear regression 作业(二)
  3. android view : 动画
  4. Eclipse web项目引用其它项目时的部署问题
  5. [Codevs1403]新三国争霸(MST+DP)
  6. C++语言中cin cin.getline cin.get getline gets getchar 的用法实例
  7. C#入门篇6-10:字符串操作 DateTime操作
  8. 改变Chrome浏览器主程序_缓存_个人信息路径
  9. [Java] SSH框架笔记_SSH三大框架的工作原理及流程
  10. 【Android】日常开发android.jar文件中十五个重要的包概述
  11. webservice 的权限验证
  12. Stars(树状数组+线段树)
  13. static 及 extern
  14. 15.vue使用element-ui的el-input监听不了回车事件
  15. xCode8以及iOS10 的新特性
  16. rabbitmq之基本原理及搭建单机环境
  17. 7系列FPGA的时钟资源——UG472
  18. HslCommunication组件库使用说明 (转载)
  19. spring boot: ConfigurationProperties
  20. Prometheus监控学习笔记之全面学习Prometheus

热门文章

  1. centos 8.3系统调优参数配置
  2. CentOS-Docker搭建Nacos-v1.3.2(单点)
  3. phpstorm之&quot;Can not run PHP Code Sniffer&quot;
  4. 6 shell内置命令
  5. Python之面向对象编程【小明跑步】、【置办家具】
  6. 『心善渊』Selenium3.0基础 — 29、使用HTMLTestRunner生成unittest的HTML报告
  7. Django基础07篇 ORM操作
  8. Podistributor播客分发系统介绍
  9. 「 题解」NOIP2021模拟赛(2021-07-19)
  10. 从新建文件夹开始构建ShadowPlay Engine游戏引擎(4)