PTA-L1-043 阅览室 (20分)
这道题其实是数据结构,不难,就是数据处理方面。
我是把小时和分钟分开存储的
书的编号作为各个数组的下标
vis[num]标记编号为num的书是否为借阅状态
h[num]标记编号为num的书借出小时数
mi[num]标记编号为num的书借出分钟数
然后在输出中处理结果就行。
注意几个易错点:
1.每次一天过完后都需要重新把我们的各个数组mst一下,因为上一天可能存在不合法的情况
2.排除不合法的情况,有借无还,无借有还这种,其中有借无还这种包含了,一本书在未被还的情况下借阅多次,那么按照最后一次借出为准,前面的借出都是不合法的情况
(我在这个测试点wa了,因为我是按照第一次借出为准算的)
代码部分:
#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
const int N = 1e3 + 10;
int t;
int vis[N];
int h[N];
int f[N];
int cnt;
int main()
{
cin >> t;
while (t--)
{
mst(vis, 0);
mst(h, 0);
mst(f, 0);
cnt = 0;
double ans = 0;
int num;
char op, k;
int hour, mi;
while (1)
{
cin >> num >> op >> hour >> k >> mi;
if (!num)
{
break;
}
if (!vis[num] || op == 'S')
{
vis[num] = 1;
h[num] = hour;
f[num] = mi;
}
else
{
if (op == 'E')
{
cnt++;
vis[num] = 0;
if (mi < f[num])
{
mi += 60;
hour--;
ans += (mi - f[num] + (hour - h[num]) * 60);
f[num] = 0;
h[num] = 0;
}
else
{
ans += (mi - f[num] + (hour - h[num]) * 60);
}
}
else
{
continue;
}
}
}
if (!cnt)
{
ans = 0;
}
else
{
ans = 1.0 * ans / cnt;
}
printf ("%d %.0f\n", cnt, ans);
//cout << num << " " << op << " " << hour << " " << mi;
}
return 0;
}