Cod sursa(job #1314571)

Utilizator retrogradLucian Bicsi retrograd Data 11 ianuarie 2015 23:23:50
Problema Elementul majoritar Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
#include<vector>
#include<algorithm>

using namespace std;

ifstream fin("elmaj.in");
ofstream fout("elmaj.out");

vector<int> CAND, AP, A;
vector<int>::iterator it;

void adaugaCand(int i) {
    for(it = CAND.begin(); it!=CAND.end(); it++) {
        if(*it == i) {
            return;
        }
    }
    CAND.push_back(i);
    AP.push_back(0);
}

int b, e;
bool bsearch(int &val, int &poz) {
    b = 0; e = CAND.size() - 1;
    while(b!=e) {
        if(val>CAND[(b+e)/2])
            b = (b+e)/2+1;
        else
            e = (b+e)/2;
    }
    poz = b;
    return val == CAND[b];
}

void afis(vector<int> &v) {
    for(int i=0; i<v.size(); i++) {
        fout<<v[i]<<" ";
    }fout<<endl;
}

int n, last, cur;
int main() {
    fin>>n>>last;
    A.push_back(last);
    for(int i=2; i<=n; i++) {
        fin>>cur;
        A.push_back(cur);
        if(cur == last) {
                if(CAND.size()<=16)
                    adaugaCand(cur);
        }
        last = cur;
    }

    sort(CAND.begin(), CAND.end());

    int poz;
    for(int i=0; i<n; i++) {
        cur = A[i];
        if(bsearch(cur, poz))
            AP[poz]++;
    }

    //afis(CAND);
    //afis(AP);

    for(int i=0; i<CAND.size(); i++) {
        if(AP[i] > n/2) {
            fout<<CAND[i]<<" "<<AP[i];
            return 0;
        }
    }
    fout<<-1;

    return 0;
}