通訊錄排序
1.0s 256M通訊錄的名單是照報名順序打的,老師要一份照座號由小到大排好的版本。
請定義結構體 student——三個成員與 read()、print() 跟〔通訊錄查詢〕完全相同——再照 14.6 運算子多載:讓結構體學會比大小 的寫法多載 operator <,教會它「座號小的排前面」。有了 <,評測程式不用給 sort 第三個參數就能直接排序;min_element 這種靠「小於」吃飯的內建函式也跟著能用。
| 成員 | 型態/簽名 | 意義 |
|---|---|---|
name |
string |
姓名(小寫英文字母) |
seat |
int |
座號(保證互不相同) |
phone |
string |
電話(恰 \(10\) 個數字,可能以 0 開頭) |
read() |
void read() |
從 cin 依序讀入自己的姓名、座號、電話 |
print() |
void print() |
用 cout 印出一行 座號 姓名 電話(以一個空白分隔),結尾換行 |
operator < |
bool operator < (const student &b) const |
自己的座號比 b 的小就回傳 true——兩個 const 都要寫 |
你只需要寫這個結構體的定義,不用寫 main、不用 #include 任何東西——評測程式會自動在你的程式最上方加上這題需要的標頭(<iostream>、<string>)與 using namespace std;,要用其他標頭自己再 #include 即可。想把含有 main 的完整程式貼上來測試也可以,評測時會忽略你的 main。
可以直接複製下面的骨架來改:
struct student {
// 在這裡宣告三個成員
void read() {
// 讀入自己的三筆資料
}
void print() {
// 印出「座號 姓名 電話」並換行
}
bool operator < (const student &b) const {
// 自己是否必須排在 b 前面?
}
};
評測程式會做的事
評測程式會 #include 你的程式,然後:
- 讀入 \(N\),宣告
vector<student> a(N),對每位同學呼叫a[i].read()讀入資料。 student first = *min_element(a.begin(), a.end());——用你的<找出座號最小的同學,整包複製一份留著。sort(a.begin(), a.end());——不給第三個參數,sort自動用你多載的<排序。- 依排好的順序,對每位同學呼叫
a[i].print()。 - 最後多印一行
first.name。
若不符合規格,編譯訊息的第一行會告訴你缺了什麼,例如 [檢查] student 還沒有多載 operator <(記得兩個 const)。
輸入格式
(這是評測程式讀的輸入。)第一行有一個整數 \(N\)。接下來 \(N\) 行,每行依序是一位同學的姓名、座號、電話,以一個空白分隔。
限制
- \(1 \le N \le 2 \times 10^5\)
- 姓名由 \(1\) 到 \(10\) 個小寫英文字母組成
- \(1 \le\) 座號 \(\le 10^9\),且所有座號互不相同
- 電話恰為 \(10\) 個數字(
0到9),可能以0開頭
輸出格式
輸出 \(N + 1\) 行:前 \(N\) 行是照座號由小到大排好的名單,每行 座號 姓名 電話,以一個空白分隔;第 \(N + 1\) 行是座號最小的同學的姓名。
範例輸入 1
4
amy 30 0912345678
bob 7 0987654321
cathy 1000000000 0900000000
dora 2 0955555555
範例輸出 1
2 dora 0955555555
7 bob 0987654321
30 amy 0912345678
1000000000 cathy 0900000000
dora
範例解釋 1
座號由小到大是 dora(\(2\))、bob(\(7\))、amy(\(30\))、cathy(\(10^9\)),最後一行是座號最小的 dora。注意排序的依據是座號,不是姓名的字母順序;座號最大到 \(10^9\),int 裝得下。