L1-043 阅览室
作者:互联网
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S
键,程序开始计时;当读者还书时,管理员输入书号并按下E
键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S
没有E
,或者只有E
没有S
的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
输入格式:
输入在第一行给出一个正整数N(≤10),随后给出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<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<map> 7 #include<set> 8 #include<vector> 9 using namespace std; 10 #define ll long long 11 #define dd cout<<endl 12 const int inf=99999999; 13 const int mod=1e9+7; 14 const int maxn=1e3+7; 15 map<int,char>book;//标记书的状态 16 map<int,int>Time;//标记时间 17 int main() 18 { 19 int n; 20 scanf("%d",&n); 21 int hours,mins; 22 for(int i=0;i<n;i++) 23 { 24 book.clear();//每次使用之前先清空容器,养成好习惯 25 Time.clear(); 26 int id,hours,mins; 27 char op; 28 double count_jie=0;//用double解决四舍五入问题 29 double count_Time=0; 30 while(scanf("%d %c %d:%d",&id,&op,&hours,&mins)!=EOF) 31 { 32 if(id==0) 33 break;//结束一天标志 34 if(book[id]==0)//等于0说明为空 35 { 36 if(op=='E') 37 continue;//还没借书直接还书,直接忽略 38 else if(op=='S')//借书 39 { 40 book[id]=op; 41 Time[id]+=(hours*60+mins); 42 } 43 } 44 else if(book[id]=='S') 45 { 46 if(op=='S') 47 { 48 Time[id]=(hours*60+mins);//注意这里要刷新借书时间,有关于测试点1 49 continue; 50 } 51 else if(op=='E') 52 { 53 count_jie++; 54 count_Time+=(hours*60+mins-Time[id]); 55 Time[id]=0;//还完书重置标记 56 book[id]=0; 57 } 58 } 59 } 60 if(count_jie==0) 61 printf("0 0\n"); 62 else 63 printf("%.0lf %.0lf\n",count_jie,(count_Time+0.5)/count_jie); 64 } 65 return 0; 66 }
标签:10,00,17,纪录,08,阅览室,L1,include,043 来源: https://www.cnblogs.com/xwl3109377858/p/10346611.html