Cod sursa(job #735220)

Utilizator test0Victor test0 Data 15 aprilie 2012 21:31:00
Problema Elementul majoritar Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <stdlib.h>
#include <time.h>
#define MOD 666013
struct list{int x; struct list*next; }*h[MOD];
int n,k,v[MOD];
bool e[MOD];

void insert(int x){
    int p=x%MOD;
    v[p]++;
    if(h[p]==NULL){
       h[p]=new list; h[p]->x=x; h[p]->next=NULL; return; }
     list*c=new list; c->x=x; c->next=h[p];
     h[p]=c;
}

void process(int k){
    int t=v[k],p=0,i,w,nr;
    while(h[k]!=NULL){v[++p]=h[k]->x; h[k]=h[k]->next;}

srand(time(NULL));

    while(t>=n/2+1){
        while(e[(i=rand()%(p+2))]);
        w=v[i]; nr=0;
        for(i=1;i<=p;i++)
        if(v[i]==w){ nr++; e[i]=1; }
        if(nr>=n/2+1){printf("%d %d\n",w,nr);return;}
        t-=nr;
    }
    printf("-1");
}


int main(){
    int x;
    freopen("elmaj.in","r",stdin);
    freopen("elmaj.out","w",stdout);
        scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        insert(x); }
    k=0;
    for(int i=1;i<MOD;i++)
    if(v[i]>=n/2+1){k=i; break; }
    if(k==0)printf("-1"); else process(k);
}