Cod sursa(job #1410261)

Utilizator andreiblaj17Andrei Blaj andreiblaj17 Data 30 martie 2015 22:59:09
Problema Elementul majoritar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#define nmax 1000005

using namespace std;

FILE *fi, *fo;

int n, k;
int A[nmax];

int qs(int st, int dr)
{
    int i = st, j = dr, 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 st, int dr, int k)
{
    if (st == dr)
        return;
    
    int pos = qs(st, dr);
    int len = pos - st + 1;
    
    if (len >= k)
        solve(st, pos, k);
    else
        solve(pos+1, dr, k-len);
}

int main()
{
    
    fi = fopen("elmaj.in","r");
    fo = fopen("elmaj.out", "w");
    
    fscanf(fi, "%d", &n);
    for (int i = 1; i <= n; i++)
        fscanf(fi, "%d", &A[i]);
    
    k = n/2 + 1;
    
    solve(1, n, k);
    
    int rez = 0;
    
    for (int i = 1; i <= n; i++)
        if (A[i] == A[k])
            rez++;
    
    if (rez >= n/2 + 1)
    {
        fprintf(fo, "%d", -1);
        return 0;
    }
    
    fprintf(fo, "%d %d\n", A[k], rez);
    
    fclose(fi);
    fclose(fo);
    
    return 0;
}