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;
}


目录
相关文章
|
4月前
|
存储 编解码
1068 万绿丛中一点红 (20 分)
1068 万绿丛中一点红 (20 分)
|
4月前
1071 小赌怡情 (15 分)
1071 小赌怡情 (15 分)
|
4月前
|
测试技术
1039 到底买不买 (20 分)
1039 到底买不买 (20 分)
|
4月前
|
数据安全/隐私保护
1048 数字加密 (20 分)
1048 数字加密 (20 分)
L1-044 稳赢 (15 分)
L1-044 稳赢 (15 分)
143 0
L1-044 稳赢 (15 分)
h0123. 素数判断 (20 分)
h0123. 素数判断 (20 分)
146 0
L3-011 直捣黄龙 (30 分)
L3-011 直捣黄龙 (30 分)
124 0
L1-059 敲笨钟 (20 分)
L1-059 敲笨钟 (20 分)
119 0
L1-010 比较大小 (10 分)
L1-010 比较大小 (10 分)
78 0
L1-047 装睡 (10 分)
L1-047 装睡 (10 分)
115 0