链接: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 }