ZeroJudge F277: 嘿嘿想不到吧

偉哉北一機研,109學年度招生大成功! 全校700多名學生,有698名以機研為第一志願,身為北一第一大社,機研理所當然地收了全部的學生,但是由於學校行政效率及品質的低落,送來的名單,居然是亂七八糟的QQ 這讓社長頭很痛,於是就笨笨的人工把698名學妹的資料 (姓名、班級、座號、個介),按照班級座號排好了。站在一旁的程式教學實在是看不下去,就想要寫一個程式,造福未來的幹部們,但是她也一樣笨,想了好久都想不到方法。請聰明的妳,幫忙寫一個程式,把社團成員的資料按照班級排序,若是班級相同,就按照座號排序

範例測資

範例輸入範例輸出
每筆測資第一行會輸入 N,代表應屆學妹的人數,接著會有 N 行輸入,格式如下:
姓名 班級 座號 個介
其中「姓名」和「個介」中不含有空白「班級」和「座號」為整數
( N <= 105)
請輸出排序過後的社員資料表,對於每個社員,輸出兩行
第一行為 : 班級 座號 姓名 (以空白隔開)
第二行為 : 個介
3
陳希臻 15 12 我喜歡吸貓
鄭允臻 14 27 我討厭陳芭樂
魏家琦 8 37 我其實是白家琦
8 37 魏家琦
我其實是白家琦
14 27 鄭允臻
我討厭陳芭樂
15 12 陳希臻
我喜歡吸貓
ZeroJudge F277 範例測資

解題思路

「班級」和「座號」存到一個 Pair<int, int> 中,並且存放到一個 陣列/Vector 中,然後把「姓名」和「個介」存到一個 Pair<string, string> 中。宣告一個 Map<pair<int, int>, pair<string, string>> 的資料型態,這個 Map 的 Key 值就是「班級」和「座號」的 PairValue 值就是「姓名」和「個介」的 Pair

存有 Pair<int, int> 的 陣列/Vector 進行 Sort 之後,由小到大將 陣列/Vector 中的「班級」和「座號」依序輸出。同時,使用每次輸出的 Pair<int, int> 的 Map 對應到的 Value 值來輸出「姓名」和「個介」的 Pair<string, string>。

範例程式碼-ZeroJudge F277: 嘿嘿想不到吧

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

pair<int, int> rtn(int a, int b)
{
    pair<int, int>tmp;
    tmp.first = a;
    tmp.second = b;
    return tmp;
}

pair<string, string> pp (string a, string b)
{
    pair<string, string>tmp;
    tmp.first = a;
    tmp.second = b;
    return tmp;
}

int main() {
    int N;
    cin >> N;
    vector<pair<int, int>>v;
    map<pair<int, int>, pair<string, string>>MAP;
    for (int i = 0; i<N; i++)
    {
        string name, word;
        int c, no;
        cin >> name >> c >> no >> word;
        pair<int, int>p = rtn(c, no);
        v.push_back(p);
        MAP[p] = pp(name, word);
    }
    sort(v.begin(), v.end());
    for (int i = 0; i<N; i++)
    {
        cout << v[i].first << " " << v[i].second << " " << MAP[v[i]].first << "\n" << MAP[v[i]].second << "\n";
    }
}

//ZeroJudge F277
//Dr. SeanXD

發佈留言