Cod sursa(job #1312088)

Utilizator thesvcoolmanLucian Bicsi thesvcoolman Data 8 ianuarie 2015 21:24:41
Problema Elementul majoritar Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream>
#include<vector>
#include<algorithm>

using namespace std;

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

vector<int> CAND, AP, A;

void adaugaCand(int i) {
    int in;
    for(in=0; in<CAND.size(); in++) {
        if(CAND[in] == 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) {
                adaugaCand(cur);
                if(CAND.size()>16) break;
        }
        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;
}