Pagini recente » Cod sursa (job #1515573) | Cod sursa (job #2886718) | Cod sursa (job #45779) | Cod sursa (job #397921) | Cod sursa (job #1167137)
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
#define MaxN 3000100
int v[MaxN];
int getpivot( int lo, int hi )
{
int i;
int mid = lo + ( rand() % ( hi - lo + 1 ) );
int pivot = v[mid];
int dummy;
v[mid] = v[hi];
int indexpivot = lo;
for ( i = lo; i < hi; ++i )
{
if ( v[i] < pivot )
{
if ( i != indexpivot )
{
dummy = v[i];
v[i] = v[indexpivot];
v[indexpivot++] = dummy;
}
else
++indexpivot;
}
}
v[hi] = v[indexpivot];
v[indexpivot] = pivot;
return indexpivot;
}
int quickselect( int lo, int hi, int k )
{
if ( lo == hi )
return v[lo];
int sorted = getpivot( lo, hi );
int localsorted = sorted - lo + 1;
if ( localsorted == k )
return sorted;
if ( localsorted > k )
return quickselect( lo, sorted - 1, k );
return quickselect( sorted + 1, hi, k - localsorted );
}
int main()
{
ifstream f1( "elmaj.in" );
ofstream f2( "elmaj.out" );
srand( time( NULL ) );
int i, n;
f1 >> n;
for ( i = 1; i <= n; ++i )
f1 >> v[i];
int mid = v[ quickselect( 1, n, n / 2 ) ];
int count = 0;
for ( i = 1; i <= n; ++i )
{
if ( v[i] == mid )
++count;
}
if ( count >= n / 2 + 1 )
f2 << mid << ' ' << count << '\n';
else
f2 << "-1\n";
f1.close();
f2.close();
return 0;
}