數數跟排序大概是我們從兩三歲起就開始訓練的技能,
現在該是你好好發揮這個技能的時候了!
範例測資
範例輸入 | 範例輸出 |
---|---|
EOF 輸入,每組測資的第一行含一個整數 N,1 <= N <= 1000,接下來有 N 個範圍為 0~9 的整數 A1、A2、…、AN。 | 把輸入的數字按照出現次數由多到少排序, 若次數相同,優先輸出數值較小的數字。 參考範例輸出。 |
5 1 4 5 1 4 10 0 0 0 0 9 9 9 2 2 8 | 1 4 5 0 9 2 8 |
解題思路
先宣告一個 Map<int, int> 紀錄每一個數字出現的次數。
再來跑 for (auto it:Map) 來取每一個出現的數字與其出現次數,宣告一個 Vector<pair<int, int>> ans 來存取這兩個資料。將 it.first*-1,因為之後要進行排序數值較小要在較後面,這樣子可以從最後面進行輸出。將 it.first 還有 it.second 對調之後 Push_Back 到 ans 中。存取完所有資料後進行排序。最後從 ans 的最後一個位置輸出到第零個位置,輸出 ans[i].second*-1。
範例程式碼-ZeroJudge A218: 連猴子都會的小case
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N;
while (cin >> N)
{
map<int, int>MAP;
for (int i = 0; i<N; i++)
{
int tmp;
cin >> tmp;
MAP[tmp]++;
}
vector<pair<int, int>>ans;
for (auto it:MAP)
{
pair<int, int>tmp;
tmp.first = it.second;
tmp.second = it.first * -1;
ans.push_back(tmp);
}
sort(ans.begin(), ans.end());
for (int i = int(ans.size())-1; i>=0; i--)
{
cout << ans[i].second * -1 << " ";
}
cout << "\n";
}
}
//ZeroJudge A218
//Dr. SeanXD