Răspuns :
Program C:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//Calculeaza log2(x), unde x este o putere a lui 2
int lg2p(unsigned x) {
if (x == 0) return -1;
int bk = 0;
while ((x & 1) == 0) {
++bk;
x >>= 1;
}
return bk;
}
int main() {
unsigned dim, n, tmp;
//Citire pozitie
scanf("%u", &n);
//Citire dimensiune vector
scanf("%u", &dim);
//Citire elemente, calculare valori bucket
int bkt[31] = {0};
for (unsigned i = 0; i < dim; i++) {
scanf("%u", &tmp);
++bkt[lg2p(tmp)];
}
//Afisare rezultat
int curent=0;
int idbkt = 0;
while (curent < n) {
curent += bkt[idbkt++];
}
printf("%u", 1 << idbkt);
}
Explicatie :
Stiind ca toate numerele sunt o putere a lui 2 putem calcula usor logaritm in baza 2 al fiecarui numar.
Folosim un vector de frecventa in care memoram cate numere de acelasi fel exista pentru orice putere a lui 2. Putem apoi determina rapid ce numar se afla pe orice index.
Vezi counting sort.
Nota :
Se considera ca [tex]n\leq k[/tex]

Vă mulțumim că ați ales să vizitați platforma noastră dedicată Informatică. Ne bucurăm dacă informațiile oferite v-au fost de folos. Pentru întrebări sau asistență suplimentară, nu ezitați să ne contactați. Revenirea dumneavoastră ne onorează – adăugați-ne la favorite pentru a fi mereu la curent!