Cod sursa(job #1371527)

Utilizator somuBanil Ardej somu Data 3 martie 2015 22:01:12
Problema Elementul majoritar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
#define nmax 1000005

using namespace std;

int n, num, nr;
int A[nmax];

int q(int st, int dr) {
    
    int i = st;
    int j = dr;
    int pivot = A[st + rand() % (j - i + 1)];
    
    while (1) {
        
        for (; A[i] < pivot;) i++;
        for (; A[j] > pivot;) j--;
        
        if (i <= j)
            swap(A[i++], A[j--]);
        else
            return j;
        
    }
    
    return 0;
    
}

void solve(int lo, int hi, int k) {
    
    if (lo == hi) return;
    
    int mid = q(lo, hi);
    int len = mid - lo + 1;
    
    if (k <= len)
        solve(lo, mid, k);
    else
        solve(mid+1, hi, k-len);
    
}

int main() {
    
    srand(time(0));
    
    ifstream fin("elmaj.in");
    ofstream fout("elmaj.out");
    
    fin >> n;
    for (int i = 1; i <= n; i++)
        fin >> A[i];
    
    solve(1, n, n/2);
    
    num = A[n/2];
    
    for (int i = 1; i <= n; i++)
        if (A[i] == num)
            nr++;
    
    if (nr > n/2)
        fout << num << " " << nr << "\n";
    else
        fout << -1 << "\n";
    
    fin.close();
    fout.close();
    
    return 0;
}