ZeroJudge A218: 連猴子都會的小case

數數跟排序大概是我們從兩三歲起就開始訓練的技能,

現在該是你好好發揮這個技能的時候了!

範例測資

範例輸入範例輸出
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

發佈留言