#include #include #define DEFAULT_SIZE 512 // Klidně je možné zvolit i 1, ale lepší je začít nějakou větší konstantou :) // Komparační funkce pro knihovní qsort int compare (const void * a, const void * b) { return(*(int*)a - *(int*)b); } int main() { int size = DEFAULT_SIZE; int N = 0; int *exponents = malloc(sizeof(int) * size); for(int i = 0; i < size; i++) exponents[i] = 0; // Načtení vstupu do dynamicky se zvětšujícího pole: Pokaždé, když nám // dojde místo v poli, tak se pokusíme pole realokovat na dvojnásobně // velké int k; while(scanf("%d", &k) == 1) { if (N == size) { // Musíme zvětšit pole na dvojnásobek exponents = realloc(exponents, sizeof(int) * size * 2); if (exponents == NULL) { fprintf(stderr, "Problem durring allocating array for %d integers!\n", size * 2); exit(1); } for(int i = size; i < size * 2; i++) exponents[i] = 0; size *= 2; } exponents[N] = k; N++; } // Seřadíme prvky v poli pomocí quicksortu (pro krátkost použijeme knihovní funkci) qsort (exponents, N, sizeof(int), compare); // Postupně projdeme pole od nejmenších exponentů (od začátku). Budeme // si průběžně držet počet stejných exponentů, přepočítávat ho, // a započítávat počet nul, které cestou mineme. int keys = 0; int current = 0; int current_ammount = 0; for (int i = 0; i < N; i++) { while (exponents[i] != current) { // Postupně odkrokujeme po exponentech až k tomu dalšímu, který potkáme if(current_ammount % 2 == 0) keys++; current_ammount = current_ammount / 2; current += 1; // Abychom nemuseli krokovat, když už nic nemáme, dovolíme si i přeskok if (current_ammount == 0) { keys += exponents[i] - current; current = exponents[i]; } } current_ammount++; } printf("%d\n", keys); return 0; }