【一敗塗地】L1-043 閱覽室 (20分) 題解

【一敗塗地】L1-043 閱覽室 (20分) 題解

菜題只能試

題目鏈接:L1-043 閱覽室 (20分)

題目

天梯圖書閱覽室請你編寫一個簡單的圖書借閱統計程序。當讀者借書時,管理員輸入書號並按下S鍵,程序開始計時;當讀者還書時,管理員輸入書號並按下E鍵,程序結束計時。書號爲不超過1000的正整數。當管理員將0作爲書號輸入時,表示一天工作結束,你的程序應輸出當天的讀者借書次數和平均閱讀時間。

注意:由於線路偶爾會有故障,可能出現不完整的紀錄,即只有S沒有E,或者只有E沒有S的紀錄,系統應能自動忽略這種無效紀錄。另外,題目保證書號是書的唯一標識,同一本書在任何時間區間內只可能被一位讀者借閱。

輸入

輸入在第一行給出一個正整數N(≤10),隨後給出N天的紀錄。每天的紀錄由若干次借閱操作組成,每次操作佔一行,格式爲:

書號([1, 1000]內的整數) 鍵值SE發生時間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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章