ZeroJudge M702: 傑出校友票選活動

題目敘述

每筆測資第一行有兩個正整數N和M,接下來會有N行,每行會有一個不含空格的字串,代表這個人得了一票,要求輸出得票數前M名的人 (不會有同票的情況)。


範例輸入 #1

10 3

Peter

James

John

John

James

James

Peter

Peter

Peter

Paul

範例輸出 #1

Peter James John


解題思路

使用Map來紀錄每個人的得票數,再來使用Auto來跑Map的For迴圈,將Map中的值改用Pair<int, string> (倒過來) 的方式存到另外一個陣列中。將陣列Sort過後將陣列位置最後M個資料做輸出,有可能M會比N還要大,這樣會在跑For迴圈的時候造成記憶體區段錯誤,所以For迴圈的終止條件可以寫成 max(0, 陣列長度-M),這樣如果M比N大造成終止條件為負數時,終止條件會改成0避免記憶體區段錯誤。

解題程式碼如下 (僅供參考):

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

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

int main() {
    int N, M;
    cin >> N >> M;
    map<string, int>MAP;
    for (int i = 0; i<N; i++)
    {
        string tmp;
        cin >> tmp;
        MAP[tmp]++;
    }
    vector<pair<int, string>>v;
    for (auto it:MAP)
    {
        v.push_back(rtn(it.second, it.first));
    }
    sort(v.begin(), v.end());
    for (int i = int(v.size())-1; i>=max(0, int(v.size())-M); i--)
    {
        cout << v[i].second << " ";
    }
    cout << "\n";
}

留言