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