zoukankan      html  css  js  c++  java
  • PAT 天梯赛 L1-043 阅览室

    L1-043. 阅览室

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

    天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下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

    思路:
    要注意几个坑点,如果同一本书在还没还书记录时有多次被借记录,取最后一次记录为准。
    一本书在只借一次的情况下有多次还书记录,取最前面的一次还书记录,其余都是无效操作。

    AC代码:
    #define _CRT_SECURE_NO_DEPRECATE
    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<algorithm>
    #include<cstring> 
    #include<string>
    #include<queue>
    #include<cmath>
    #include<map>
    
    using namespace std;
    #define INF 0x3f3f3f3f
    #define EPS 1e-5
    #define pi cos(-1)
    const int N_MAX = 2000+15;
    struct Time {//time不能用,编译错误
        int hour, min;
        bool flag=0;
        Time() {}
        Time(int hour,int min):hour(hour),min(min) {}
    };
    int main() {
        int n;
        while (scanf("%d",&n)!=EOF) {
            int num,hour,min;
            char c;
            for (int i = 1; i <= n;i++) {
                map< int, Time > Map;
                int res = 0,ave = 0;
                while (1) {
                    scanf("%d %c %d:%d",&num,&c,&hour,&min);
                    if (num==0) {//当天结束
                        if (res == 0)puts("0 0");
                        else printf("%d %.0f
    ", res, (double)ave/res);
                        break;
                    }
                    if (c == 'S') {
                         Map[num] = Time(hour, min);//有多次借书记录,取最后一次借书记录(样例4)
                    }
                    else if (c == 'E') {
                        map<int, Time >::iterator it=Map.find(num);
                        if (it!=Map.end()&&it->second.flag==0) {//有该书的借书记录,并且还没归还
                            it->second.flag = true;//若该书再次借出,不记录(样例2)
                            res++;
                            int diff = (hour - Map[num].hour)*60+min-Map[num].min;
                            ave += diff;
                        }
                    }
                    
                }
                Map.clear();
            }
        }
        return 0;
    }
  • 相关阅读:
    【Python数据分析】NumPy之数组对象基础
    【Oracle11g】20_函数
    【Word】排版技巧
    cache介绍
    cache verilog实现
    在verilog中使用格雷码
    同步fifo与异步fifo
    AHB总线协议(二)
    Android Handler 消息机制原理解析
    值得推荐的开源C/C++框架和库
  • 原文地址:https://www.cnblogs.com/ZefengYao/p/8047917.html
Copyright © 2011-2022 走看看