Pagini recente » Cod sursa (job #1223472) | Cod sursa (job #2442795) | Cod sursa (job #234837) | Cod sursa (job #1745817) | Cod sursa (job #2291488)
#include <fstream>
#include <random>
using namespace std;
int n, v[1000005];
ifstream fin("elmaj.in");
ofstream fout("elmaj.out");
int alegere_pivot(int st, int dr) {
int random = st + rand() % (dr - st);
//cout << random << " ";
return random;
}
int partitie (int st, int dr) {
//cout << v[dr] << ": ";
int pivot = v[dr];
int i = st, j = dr - 1;
while (i <= j) {
if (v[i] >= pivot && v[j] < pivot) swap(v[i], v[j]);
if (v[i] < pivot) i++;
if (v[j] >= pivot) j--;
}
swap(v[i], v[dr]);
//for (int i = 0; i < n; ++i) cout << v[i] << " ";
//cout << "\n";
return i;
}
int quickselect(int st, int dr, int k) {
if (st >= dr) return st;
int pivot = alegere_pivot(st, dr);
swap(v[pivot], v[dr]);
int ret = partitie(st, dr);
if (ret > k) return quickselect(st, ret - 1, k);
if (ret < k) return quickselect(ret + 1, dr, k);
return ret;
}
int main()
{
int n;
fin >> n; int poz = n / 2;
poz--;
for (int i = 0; i < n; ++i) {
fin >> v[i];
}
quickselect(0, n - 1, poz);
int nr = 0;
for (int i = 0; i < n; ++i) {
if (v[i] == v[poz]) nr++;
}
if (nr < n /2) {
fout << -1;
return 0;
}
fout << v[poz] << " " << nr;
return 0;
}