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