Pagini recente » Cod sursa (job #1406950) | Cod sursa (job #2305986) | Cod sursa (job #786238) | Cod sursa (job #2929593) | Cod sursa (job #996016)
Cod sursa(job #996016)
#include <fstream>
#include <cstdlib>
#include <ctime>
int part(int *A, int left, int right, int k)
{
int p = A[k], index = left;
std::swap(A[k], A[right]);
for(int i = left; i < right; i++)
if(A[i] < p)
{
std::swap(A[i], A[index]);
index++;
}
std::swap(A[right], A[index]);
return index;
}
int qselect(int *A, int left, int right, int k)
{
if(left == right) return A[left];
int pi = left + rand() % (right - left);
int npi = part(A, left, right, pi);
int dist = npi - left + 1;
if(dist == k) return A[k];
else if(k < dist) return qselect(A, left, npi - 1, k);
else return qselect(A, npi + 1, right, k - dist);
}
int main()
{
srand(time(NULL));
std::ifstream in("elmaj.in");
std::ofstream out("elmaj.out");
int nV, nr = 0, nMaj;
in >> nV;
int *nArr = new int[nV];
for(int i = 0; i < nV; i++)
in >> nArr[i];
nMaj = qselect(nArr, 0, nV - 1, nV / 2);
for(int i = 0; i < nV; i++)
if(nArr[i] == nMaj) nr++;
if(nr > nV / 2)
out << nMaj << ' ' << nr;
else out << -1;
return 0;
}