【一敗塗地】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]內整數)
每一天的紀錄保證按時間遞增的順序給出。
輸出
對每天的紀錄,在一行中輸出當天的讀者借書次數和平均閱讀時間(以分鐘爲單位的精確到個位的整數時間)。
樣例輸入
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
解題思路
這題全是坑,題意跟你想的都不太一樣,根本不需要記錄一本書的所有區間,一本書只會借出去一次
- 只使用 最中間的SE 也就是說統計的時間區間是相鄰的,中間不會夾雜多餘的S和E【text2 卡這個
- 如果有多個S沒有遇到E時,使用最後一個S
- 之後一遇到E就和已經存在的S數據匹配,如果沒有S的記錄就跳過E記錄
- 最後的結果是 四捨五入 注意不是 直接捨去小數 也不是 有小數直接進一 而是 四捨五入 【text4 卡這個
看過了代碼以後突然覺得自己都想了一堆什麼亂七八糟的東西,
代碼
#include <iostream>
#define MAXN int(1e3 + 9)
using namespace std;
int v[MAXN];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
string s;
getline(cin, s);
while (t--) {
for (int i = 0; i < MAXN; i++) v[i] = -1;
int cc = 0, ss = 0;
while (true) {
getline(cin, s);
int x, h, m; char c;
sscanf(s.c_str(), "%d %c %d:%d", &x, &c, &h, &m);
if (!x) break;
m += 60*h;
if (c == 'S') {
v[x] = m;
} else if (v[x] >= 0) {
cc += 1;
ss += m - v[x];
v[x] = -1;
}
}
if (cc) cout << cc << ' ' << int(1.0*ss/cc + 0.5) << endl;
else cout << "0 0" << endl;
}
return 0;
}
上面那個代碼是用正確思路重寫的,下面那個是一開始想用vector篩選,然後改改改改對的
#include <iostream>
#include <vector>
#define MAXN int(1e3 + 9)
using namespace std;
int v[MAXN][3];
vector<int> xx;
void init() {
for (int i = 0; i < MAXN; i++) v[i][0] = v[i][1] = -1;
xx.clear();
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
string s;
getline(cin, s);
while (t--) {
init();
while (true) {
getline(cin, s);
int x, h, m; char c;
sscanf(s.c_str(), "%d %c %d:%d", &x, &c, &h, &m);
if (!x) break;
m += 60*h;
if (c == 'S') {
v[x][0] = m;
} else if (v[x][0] >= 0) {
v[x][1] = v[x][0];
v[x][2] = m;
xx.push_back(x);
v[x][0] = -1;
}
}
int l = xx.size(), cc = 0, ss = 0;
for (int i = 0; i < l; i++) if (v[xx[i]][2] >= 0 && v[xx[i]][1] >= 0) {
cc += 1;
ss += v[xx[i]][2] - v[xx[i]][1];
}
if (cc) cout << cc << ' ' << int(1.0*ss/cc + 0.5) << endl;
else cout << "0 0" << endl;
}
return 0;
}