2024-04-22 00:59:24 -04:00
|
|
|
#include <math.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
2024-04-22 01:47:03 -04:00
|
|
|
// complexity is O(sqrt(N))
|
|
|
|
// well we need ot find an exact moment,
|
|
|
|
// let's say "height" at which our crystal
|
|
|
|
// balls break, for that we only have 2 balls,
|
|
|
|
// so we can't do binary search, since the range
|
|
|
|
// is tooooo huge, therefore we run a linear
|
|
|
|
// growth bigger than N, but small enough to find where
|
|
|
|
// the first ball breaks, then we take the interval
|
|
|
|
// between: [the previous non-break] and [where it broken]
|
|
|
|
// and run a normal linear search
|
|
|
|
// therefore we run sqrt(n) + sqrt(n) times
|
|
|
|
// so it's O(sqrt(N)
|
|
|
|
|
2024-04-22 00:59:24 -04:00
|
|
|
#define SIZE 999
|
|
|
|
|
|
|
|
int two_crystal_balls_search(int array[], int size, int value)
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
int step = sqrt((double)(size));
|
|
|
|
for (; i < size; i = i + step)
|
|
|
|
if (array[i] >= value)
|
|
|
|
break;
|
|
|
|
|
|
|
|
printf("Step is: %d\n", step);
|
|
|
|
printf("The first one broke at: %d\n", i);
|
|
|
|
|
|
|
|
i = i - step;
|
|
|
|
for (; i < i + step; ++i)
|
|
|
|
if (array[i] >= value)
|
|
|
|
return i;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
int array[SIZE];
|
|
|
|
for (int i = 0; i < SIZE; ++i)
|
|
|
|
array[i] = i;
|
|
|
|
|
|
|
|
printf("The balls break at: %d\n", two_crystal_balls_search(array, SIZE, 567));
|
|
|
|
}
|