題目敘述
每筆測資第一行有兩個正整數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";
}
留言
張貼留言