ZeroJudge N327: The Tower of Names

在英文裡,很多名字出現在一個清單時,常常會以英文字母排序 (Alphabetical Order),方便人們查找。但是文文覺得這樣長短不一的名字混雜在一起,不太整齊,於是他就先用名字的長短排序,相同長度的名字才以字母排序,如此一來,當你把這名字的清單列出來是會是上窄下寬,看起來就像是一座塔。

給你若干個名字,請以文文的方式排序後輸出。

範例測資

範例輸入範例輸出
輸入的第一行含有一個整數 N (0 < N <= 100),接下來有 N 行,每行含有一個由英文字母、句點 (.)、連字號 (-)、雙引號 (“)、及「空白」所組成的英文姓名。將輸入的姓名先以長度 (含中間的空白及其它符號) 排序,長度相同時,則以字母順序排序。
5
Alexander Smith
Mia Johnson
Benjamin Lee
Isabella Chang
Oliver Taylor
Mia Johnson
Benjamin Lee
Oliver Taylor
Isabella Chang
Alexander Smith
4
Ethan Baker
April Adams
Jacob White
Emily Clark
April Adams
Emily Clark
Ethan Baker
Jacob White

解題思路

將 N 進行輸入後要先進行一次無用的 getline,這樣之後的 getline 才會都收得到資料

宣告一個 Map<int, vector<string>>,Key 值為字串的長度, Value 值為這個長度有哪些字串。收字串的時候判斷這個字串的長度,並將這個字串 Push_Back 到 Map[字串長度] 中。

輸出時使用 for (auto it:Map),將 it.second 進行 Sort 之後再開一個 For迴圈 將 it.second (Vector<string>) 中的資料依序輸出。

範例程式碼-ZeroJudge N327: The Tower of Names

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int main() {
    int N;
    cin >> N;
    string s;
    getline(cin, s);
    map<int, vector<string>>MAP;
    for (int i = 0; i<N; i++)
    {
        string str;
        getline(cin, str);
        vector<string>tmp;
        int len = int(str.length());
        tmp.assign(MAP[len].begin(), MAP[len].end());
        tmp.push_back(str);
        sort(tmp.begin(), tmp.end());
        MAP[len].clear();
        MAP[len].assign(tmp.begin(), tmp.end());
    }
    for (auto it:MAP)
    {
        vector<string>tmp = it.second;
        for (int i = 0; i<tmp.size(); i++)
        {
            cout << tmp[i] << "\n";
        }
    }
}

//ZeroJudge N327
//Dr. SeanXD

發佈留言