allies apple problem code example
Example: allies apple problem
We can use binary search.
1. Double the half square side. When we reach the number of collected apples, it stops.
2. Use the binary search to get the minimal perimeter.
int CalculateApples(int x)
{
int result = 0;
for (int i = -x+1; i <= x-1; i++)
{
result += abs(i) + x;
}
result = result * 4 + (x+x)*4;
return result;
}
int GetMinimalPerimeter(int X)
{
int result;
int cur = 1;
while (true)
{
int num_apples = CalculateApples(cur);
if (num_apples == X)
{
result = 8 * cur;
return result;
}
if (num_apples > X)
{
result = 8 * cur;
break;
}
cur *= 2;
}
if (cur == 1) return result;
int left = cur / 2, right = cur;
while (left <= right)
{
int m = left + (right - left) / 2;
int num_apples = CalculateApples(m);
if (num_apples == X)
{
result = 8 * m;
return result;
}
else if (num_apples > X)
{
result = 8 * m;
right = m - 1;
}
else
{
left = m + 1;
}
}
return result;
}