链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805087447138304
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S
键,程序开始计时;当读者还书时,管理员输入书号并按下E
键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S
没有E
,或者只有E
没有S
的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
输入格式:
输入在第一行给出一个正整数n:
书号
([1, 1000]内的整数) 键值
(S
或E
) 发生时间
(hh:mm
,其中hh
是[0,23]内的整数,mm
是[0, 59]内整数)
每一天的纪录保证按时间递增的顺序给出。
输出格式:
对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。
输入样例:
3 1 S 08:10 2 S 08:35 1 E 10:00 2 E 13:16 0 S 17:00 0 S 17:00 3 E 08:10 1 S 08:20 2 S 09:00 1 E 09:20 0 E 17:00
输出样例:
2 196 0 0 1 60
注意每一次要重置借书记录,直接写一个函数转换时间,不用对string一个一个的进行操作,一借一还之后还可以重复的借书
代码:
1 #include<iostream>
2 #include<cstdio>
3 #include<map>
4 #include<cmath>
5 #include<cstring>
6 using namespace std; 7 const int maxn=1e3+5; 8 int flag[maxn];//记录书借出的时间
9
10 int check(string s)//将时间转换为分钟数
11 { 12 int h=(s[0]-'0')*10+s[1]-'0'; 13 int m=(s[3]-'0')*10+s[4]-'0'; 14 int time=h*60+m; 15 return time; 16 } 17
18 //重置借书记录
19 void reset(int book[]) 20 { 21 for(int i=0; i<maxn; i++) 22 book[i]=-1; 23 return; 24 } 25
26 int main() 27 { 28 int day,id;//记录天数和书的编号
29 char ch; 30 string s; 31 cin>>day; 32 cin>>id>>ch>>s; 33 int t=0,n=0;//t,借书次数,n,总阅读时间
34 reset(flag);//大方向重置
35 while(1) 36 { 37 if(id==0) 38 { 39 reset(flag);//每天结束后都要重置借书记录
40 double ans;//平均阅读时间
41 if(t) ans=round(n*1.0/t); 42 else ans=0; 43 cout<<t<<" "<<ans<<endl;//次数和平均时间
44 day--; 45 t=0; 46 n=0; 47 } 48
49 else if(ch=='S') flag[id]=check(s);//如果是借书,直接记录该书借出的时间
50
51 else if(ch=='E' && flag[id]!=-1) 52 { //如果是还书,那必须是之前借出的,否则视为无效还书记录不做处理
53 t++;//记录借书的次数
54 n+=check(s)-flag[id]; 55 flag[id]=-1;//重置书的编号
56 } 57 if(day==0) return 0; 58 cin>>id>>ch>>s;//这里没用数组进行输入
59 } 60 return 0; 61 }