大學的學號有九碼。
第一碼是學生身分 (學士班一般生的代號是「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 |
解題思路
可以使用 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