Pagini recente » Cod sursa (job #621916) | Cod sursa (job #740104) | Cod sursa (job #3262660) | Utilizatori inregistrati la Info Oltenia 2018 Proba Individuala Clasa a 10-a | Cod sursa (job #996023)
Cod sursa(job #996023)
#include <fstream>
#include <utility>
#include <cstdlib>
#include <ctime>
int parts(int *A, int left, int right, int k)
{
int pivot = A[k], index = left;
std::swap(A[k], A[right]);
for(int i = left; i < right; i++)
if(pivot > A[i])
{
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 = parts(A, left, right, pi);
int dist = npi - left + 1;
if(dist == k) return A[npi];
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 = 0, nr = 0, nMaj = 0;
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;
}