Cod sursa(job #760808)

Utilizator Theorytheo .c Theory Data 23 iunie 2012 00:05:45
Problema Elementul majoritar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<fstream>
#include<algorithm>
#define nmax 1000008
using namespace std;
ifstream fin("elmaj.in");
ofstream fout("elmaj.out");

long N, v[nmax], K, gasit = 0, nr;
bool verifica(int x)
{
    nr = 0;
    for(int i = 1; i <= N; i++)
        if(v[i] == x)
        nr++;
    if(nr>=N/2)
        return true;
    return false;

}

void qsort(int p, int q, int K)
{
    int piv = rand() %(q - p + 1) + p;
    swap(v[piv], v[p]);
    int st = p ;int dr = q;
    int x = v[st];
    if(verifica(x))
    {
        fout << x << " " <<nr;
        gasit = 1;
        return;
    }

    while(st<dr)
    {
        for(; st<dr && x<= v[dr]; --dr);
        v[st] = v[dr];
        for( ; st< dr && x>= v[st]; ++st);
        v[dr] = v[st];

    }
    v[st] = x;
    int pozpiv = st;
    if(K> pozpiv)
        qsort(pozpiv+ 1 , dr, K - pozpiv);
    if(K< pozpiv)
        qsort(st, pozpiv - 1, K);
}
void read()
{
    fin >>N;
    K=N/2;
    for(int i = 1; i <= N; i++)
        fin>> v[i];
    qsort(1,N, K);
    if(!gasit)
        fout << -1;
}
int main()
{
    read();
    fin.close();
    return 0;
}