👤

Cerinţa
Se dau n numere naturale cu cel mult două cifre fiecare. Afişaţi valorile distincte în ordinea descrescătoare a numărului de apariţii.

Date de intrare
Fişierul de intrare frecventa1.in conţine pe prima linie numărul n; urmează cele n numere, dispuse pe mai multe linii şi separate prin spaţii.

Date de ieşire
Fişierul de ieşire frecventa1.out va conţine pe prima linie valorile distincte dintre cele n, în ordinea descrescătoare a numărului de apariţii.

Restricţii şi precizări
1 ≤ n ≤ 100000
dacă două valori apar de acelaşi număr de ori, se va afişa mai întâi valoarea mai mică

Exemplu
frecventa1.in

8
3 19 3 65 3 19 14 3
frecventa1.out

3 19 14 65


Răspuns :

#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("frecventa1.in");
ofstream fout("frecventa1.out");
int i,v[100001],n,a[100001],sw,k,b[100001];
int main()
{
    for(i=0;i<99;i++)
        a[i]=0;
    fin>>n;
    for(i=1;i<=n&&a[v[i]]<=1;i++)
    { fin>>v[i];
        a[v[i]]++; }
    do
    {
        sw=0;
         for(i=1;i<n;i++)
        {
            if(a[v[i]]<a[v[i+1]])
            {
                v[0]=v[i];
                v[i]=v[i+1];
                v[i+1]=v[0];
                sw=1; }else if(a[v[i]]==a[v[i+1]])
            {
                if(v[i]>v[i+1])
                {
                    v[0]=v[i];
                    v[i]=v[i+1];
                    v[i+1]=v[0];
                }
            }
        }
    }while(sw!=0);
    v[0]=0;
    for(i=0;i<99;i++)
    if(a[i]!=0) k++;
    for(i=1;i<=k;i++)
        b[i]=0;
    for(i=1;i<=n;i++)
    {
        while(b[v[i]]==0)
        {
            fout<<v[i]<<" ";
            b[v[i]]++;
        }
    }return 0;
}

DA DOAR 60 PUNCTE, LIMITA DE TIMP DEPASITA