Pagini recente » Cod sursa (job #31446) | Cod sursa (job #3256966) | Cod sursa (job #2831952) | Cod sursa (job #2365170) | Cod sursa (job #2482031)
#include <iostream>
#define DIM 3000002
#define INF 0xFFFFFFFF
using namespace std;
int N, K;
int array[DIM];
int partition(int left, int right) {
int pivot = array[right];
int i = left;
for (int j = left; j < right; ++ j) {
if (array[j] <= pivot) {
swap(array[i], array[j]);
++i;
}
}
swap(array[i], array[right]);
return i;
}
int partition_random(int left, int right) {
srand(time(NULL));
int random = left + rand() % (right - left + 1);
swap(array[random], array[right]);
return partition(left, right);
}
int kthSmallest(int left, int right, int k) {
while (k > 0 && k <= right - left + 1) {
int pos = partition_random(left, right);
if (pos - left + 1 == k) {
return array[pos];
} else if (pos - left + 1 > k) {
right = pos - 1;
} else {
// pos - left < k
k -= (pos - left + 1);
left = pos + 1;
}
}
}
int main() {
FILE *fin = fopen("sdo.in", "r");
FILE *fout = fopen("sdo.out", "w");
fscanf(fin, "%d %d", &N, &K);
for (int i = 1; i <= N; i ++) {
fscanf(fin, "%d", &array[i]);
}
int result = kthSmallest(1, N, K);
fprintf(fout, "%d\n", result);
fclose(fin);
fclose(fout);
return 0;
}