L1-043 阅览室

题解

       这一题有一个核心的点,就是在一天内,一本书是可能有多次借还操作,所以上一次执行了借还操作之后一定要记得清除,避免影响到下一次借还操作。

       这一题一般人做开始的思路(dalao除外哈)统计 S 的数量,碰到 E 时就去 S 中找,找到了就返回计算,然后再删除找到的 S 这个点,我开始是这么想的,不知为何还是Error了。

       其实这一题只需要打一个标记就可以了,碰到 E 且标记存在那就计算,并还原即可,这样就会省去很多繁琐的步骤,不得不说自己编程能力还差些火候/(ㄒoㄒ)/~~。 

 

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1010;
int n;

int main()
{
    scanf("%d", &n);
    while (n--) {
        int id, hh, mm;
        char ch;
        int vis[N], bg[N], sum = 0, res = 0; 
        memset(vis, 0, sizeof(vis));
        while(scanf("%d %c %d:%d", &id, &ch, &hh, &mm) && id) {
            if (ch == 'S') {
                vis[id] = 1;
                bg[id] = hh * 60 + mm;
            }
            if (ch == 'E' && vis[id]) {
                vis[id] = 0;
                res++;
                sum += hh * 60 + mm - bg[id];
                bg[id] = 0;
            }
        }
        if (res == 0)
            printf("0 0\n");
        else
            printf("%d %d\n", res, (int)sum * 1.0 / res + 0.5);
    }
    return 0;
}

 

posted @ 2020-10-30 16:27  Fool_one  阅读(105)  评论(0编辑  收藏  举报