天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S
键,程序开始计时;当读者还书时,管理员输入书号并按下E
键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S
没有E
,或者只有E
没有S
的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
输入格式:
输入在第一行给出一个正整数N(≤),随后给出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
1 #include <bits/stdc++.h> 2 const int N =200; 3 const int inf = 0x3f3f3f3f; 4 #define ll long long 5 using namespace std; 6 #define P pair<int,int> 7 int n; 8 set<int>se; 9 int id; 10 int h,m; 11 char ex; 12 map<int,P>mp; 13 int main() 14 { 15 se.clear(); 16 scanf("%d",&n); 17 int sum = 0; 18 int cnt =0,ret = 0; 19 while(cin>>id){ 20 cin>>ex; 21 scanf("%02d:%02d",&h,&m); 22 if(id==0){ 23 printf("%d ",cnt); 24 25 // printf("%dlll ",sum); 26 if(cnt==0) printf("0 "); 27 else{ 28 29 double x = sum*1.0/cnt; 30 int y =round(x);//不能直接输出round(x) 31 printf("%d ",y); 32 } 33 //printf("%.2f ",x); 34 se.clear(); 35 sum=0.0; 36 ret++; 37 cnt=0; 38 if(ret==n) break; 39 } 40 else if(ex=='S') //不能未出现就插入:比如 E E 41 { 42 se.insert(id); 43 // printf("%d ",se.size()); 44 45 46 mp[id].first = h;mp[id].second = m; 47 48 49 50 } 51 else if(ex=='E') 52 { 53 //se.erase(id); 54 if(se.count(id)==1){//必须是还书而且之前被借过,才可以 55 cnt++; 56 se.erase(id);//如果又有一个对应的E呢 57 // printf("%d ",cnt); 58 P p =mp[id]; 59 int sum1=p.first*60+p.second; 60 //printf("sum1 %d ",sum1); 61 sum+=((h*60+m)-sum1); 62 } 63 //printf("sum %d ",sum); 64 } 65 } 66 return 0; 67 }