L1-043 阅览室 (20 分)

简介: L1-043 阅览室 (20 分)

天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。


注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。


输入格式:

输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:


书号([1, 1000]内的整数) 键值(S或E) 发生时间(hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)


每一天的纪录保证按时间递增的顺序给出。


输出格式:

对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。


输入样例:

1. 3
2. 1 S 08:10
3. 2 S 08:35
4. 1 E 10:00
5. 2 E 13:16
6. 0 S 17:00
7. 0 S 17:00
8. 3 E 08:10
9. 1 S 08:20
10. 2 S 09:00
11. 1 E 09:20
12. 0 E 17:00

结尾无空行


输出样例:

1. 2 196
2. 0 0
3. 1 60


#include<iostream>
#include<map>
#include<cstring>
using namespace std;
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int id,h,m,sum=0,ans=0;
        char op,ch;
        map<int,int>mp1,mp2;//mp1存借书时间,mp2标记,可以换成数组
        while(cin>>id>>op>>h>>ch>>m)
        {
            if(id==0)
            {
                if(ans==0) cout<<"0 0\n";//0不能做分母,所以拿出来单独判断
                else printf("%d %.0lf\n",ans,sum*1.0/ans);
                break;
            }
            else if(op=='S')
            {
                mp1[id]=h*60+m;//借书时间
                mp2[id]=1;//标记
            }
            else if(op=='E'&&mp2[id]==1)
            {
                ans++;
                mp2[id]=0;//不能借同一本书两次
                sum+=(h*60+m)-mp1[id];
            }
        }
    }
    return 0;
}


目录
相关文章
|
5月前
|
测试技术
1039 到底买不买 (20 分)
1039 到底买不买 (20 分)
|
5月前
1062 最简分数 (20 分)
1062 最简分数 (20 分)
|
11月前
|
算法
水手分椰子
水手分椰子
109 3
L1-070 吃火锅 (15 分)
L1-070 吃火锅 (15 分)
146 0
L1-070 吃火锅 (15 分)
7-9 包装机 (25 分)
7-9 包装机 (25 分)
112 0
7-9 包装机 (25 分)
|
C语言 C++
1086 就不告诉你 (15 分)
做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。
356 0
1086 就不告诉你 (15 分)
h0148. 66 (30 分)
h0148. 66 (30 分)
102 0
牛几 (10 分)
牛几 (10 分)
131 0
L1-011 A-B (20 分)
L1-011 A-B (20 分)
162 0
L1-010 比较大小 (10 分)
L1-010 比较大小 (10 分)
81 0