Cod sursa(job #1040461)

Utilizator NitaMihaitavoidcube NitaMihaita Data 24 noiembrie 2013 15:51:12
Problema Elementul majoritar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<fstream>
#include<cstdlib>
#include<ctime>
#define numaru 1000001
using namespace std;
int v[numaru];
ifstream f("elmaj.in");
ofstream g("elmaj.out");
int sdo(int s,int d,int k)
{
    int x,poz,cs,cd;
    while(true)
    {
        if(s==d)return v[s];
        cs=s;cd=d;
        poz=rand()%(d-s)+s+1;
        x=v[poz];
        while(s<d)
        {
            while(x>v[s])++s;
            while(x<v[d])--d;
            if(v[s]==v[d])++s;
            if(s<d) v[s]=(v[d]+v[s])-(v[d]=v[s]);
        }
        if(k==d)return v[d];
        else if(k>d){s=d+1;d=cd;}
        else {s=cs; d=d-1; }
    }
}
int main()
{
    int i,n,nr=0,x;
    f>>n;
    for(i=1;i<=n;++i) f>>v[i];
    x=sdo(1,n,n/2);
    for(i=1;i<=n;++i)
        if(x==v[i])++nr;
    if(nr>n/2)g<<x<<" "<<nr<<"\n";
    else g<<"-1\n";
    f.close();
    g.close();
    return 0;
}