Cod sursa(job #996015)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 10 septembrie 2013 18:33:49
Problema Elementul majoritar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <cstdlib>
#include <ctime>

int part(int *A, int left, int right, int k)
{
    int p = A[k], index = left;
    std::swap(A[k], A[right]);
    for(int i = left; i < right; i++)
        if(A[i] < p)
        {
            std::swap(A[i], A[index]);
            index++;
        }
    std::swap(A[right], A[index]);
    return index;
}

int qselect(int *A, int left, int right, int k)
{
    if(left == right) return A[left];
    int pi = left + rand() % (right - left);
    int npi = part(A, left, right, pi);
    int dist = npi - left + 1;
    if(dist == k) return A[k];
    else if(k < dist) return qselect(A, left, npi - 1, k);
    else return qselect(A, npi + 1, right, k - dist);
}

int main()
{
    srand(time(NULL));
    std::ifstream in("elmaj.in");
    std::ofstream out("elmaj.out");
    int nV, nr = 0, nMaj;
    in >> nV;
    int *nArr = new int[nV];
    for(int i = 0; i < nV; i++)
        in >> nArr[i];
    nMaj = qselect(nArr, 0, nV - 1, nV / 2 - 1);
    for(int i = 0; i < nV; i++)
        if(nArr[i] == nMaj) nr++;
    if(nr > nV / 2)
        out << nMaj << ' ' << nr;
    else out << -1;
    return 0;
}