Cod sursa(job #996023)

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

int parts(int *A, int left, int right, int k)
{
    int pivot = A[k], index = left;
    std::swap(A[k], A[right]);
    for(int i = left; i < right; i++)
        if(pivot > A[i])
        {
            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 = parts(A, left, right, pi);
    int dist = npi - left + 1;
    if(dist == k) return A[npi];
    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 = 0, nr = 0, nMaj = 0;
    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);
    for(int i = 0; i < nV; i++)
        if(nArr[i] == nMaj) nr++;
    if(nr > nV / 2)
        out << nMaj << ' ' << nr;
    else out << -1;
    return 0;
}