ZeroJudge E925: 學號檢查

大學的學號有九碼。

第一碼是學生身分 (學士班一般生的代號是「B」)。第二、三碼是入學的學年度最後兩位數。第四、五、六、七碼是院、系、組代號。第八、九碼是學生流水號。

本題假設大學永遠有下列院、系、組 (所有院、系、組代號請參考範例輸入):
– 1000 文學院
– 2000 理學院
– 3000 社會科學院
– 以下省略…

本題假設每個組都可以收 100 個學生 (第八、九碼 「00」~「99」)。


現在從一堆大學學號中隨機抽出十個學號,請撰寫一個程式,
驗證這十個學號是否是合法的學號,以及錯誤比例。
舉例來說,對於以下十個學號:

B00100000
R00100000 // 不符合學士班的學號
BA0100000 // 不符合入學年的學號
B00101300 // 不符合系組代號的學號
B001000A0 // 不符合流水號的學號
B09902005
B06A01233
B12701256
B80310020
B98901030

結果為 Y, N, N, N, N, Y, Y, Y, Y, Y
錯誤比例則為 0.4

範例測資

範例輸入範例輸出
輸入第一行有一個正整數 N(1 ≤ N ≤ 76),
代表共有 N 個院、系、組。
接下來共有 N 行文字,
每行文字皆由四個字元所構成,代表院、系、組代號。
最後共有 10 行文字,
每行皆由九個字元構成,代表欲驗證的學號。
若驗證成功輸出「Y」,若驗證失敗輸出「N」
最後則輸出驗證失敗的比例
76
0000
1000
1010
1011
1020
1030
1040
1050
1060
1070
1090
2000
2010
2020
2030
2040
2070
2080
2090
3000
3021
3022
3023
3030
3050
3100
4000
4010
4020
4030
4031
4040
4060
4080
4081
4090
4120
5000
5010
5020
5040
5050
5070
5080
6000
6010
6020
6030
6050
6060
6070
6080
6090
6100
6110
6120
6130
7000
7011
7012
7020
7030
7040
7050
8000
8010
9000
9010
9020
A000
A011
A012
A013
B000
B010
B020
B00100000
R00100000
BA0100000
B00101300
B001000A0
B09902005
B06A01233
B12701256
B80310020
B98901030
Y
N
N
N
N
Y
Y
Y
Y
Y
0.4
ZeroJudge E925 範例測資

解題思路

可以使用 Map 來判斷中間四個字元是否有出現過,輸出失敗率時如果沒有驗證失敗要輸出0而不是 0.0,如果全部都失敗要輸出 1 而不是 0.10 或 1.0

範例程式碼-ZeroJudge E925: 學號檢查

#include <iostream>
#include <map>
#include <cctype>
using namespace std;

int main() {
    int N;
    cin >> N;
    map<string, int>MAP;
    for (int i = 0; i<N; i++)
    {
        string str;
        cin >> str;
        MAP[str]++;
    }
    int wrong = 0;
    for (int i = 0; i<10; i++)
    {
        string str;
        cin >> str;
        if (str[0] != 'B')
        {
            wrong++;
            cout << "N\n";
            continue;
        }
        if (!isdigit(str[1]) || !isdigit(str[2]))
        {
            wrong++;
            cout << "N\n";
            continue;
        }
        string tmp = "";
        for (int j = 3; j<=6; j++)
        {
            tmp += str[j];
        }
        if (MAP[tmp] == 0)
        {
            wrong++;
            cout << "N\n";
            continue;
        }
        if (!isdigit(str[7]) || !isdigit(str[8]))
        {
            wrong++;
            cout << "N\n";
            continue;
        }
        cout << "Y\n";
    }
    if (wrong == 0) cout << 0 << "\n";
    else if (wrong == 10) cout << 1 << "\n";
    else cout << "0." << wrong << "\n";
}

//ZeroJudge E925
//Dr. SeanXD

發佈留言