Formatted question description: https://leetcode.ca/all/1954.html

# 1954. Minimum Garden Perimeter to Collect Enough Apples

## Level

Medium

## Description

In a garden represented as an infinite 2D grid, there is an apple tree planted at **every** integer coordinate. The apple tree planted at an integer coordinate `(i, j)`

has `|i| + |j|`

apples growing on it.

You will buy an axis-aligned **square plot** of land that is centered at `(0, 0)`

.

Given an integer `neededApples`

, return *the minimum perimeter of a plot such that at least *.

`neededApples`

apples are inside or on the perimeter of that plotThe value of `|x|`

is defined as:

`x`

if`x >= 0`

`-x`

if`x < 0`

**Example 1:**

**Input:** neededApples = 1

**Output:** 8

**Explanation:** A square plot of side length 1 does not contain any apples.

However, a square plot of side length 2 has 12 apples inside (as depicted in the image above).

The perimeter is 2 * 4 = 8.

**Example 2:**

**Input:** neededApples = 13

**Output:** 16

**Example 3:**

**Input:** neededApples = 1000000000

**Output:** 5040

**Constraints:**

`1 <= neededApples <= 10^15`

## Solution

Obviously, the side of the garden must be even. Once the side of the garden is determined, the number of apples in the garden can be calculated. Use binary search to find the minimum garden side to collect enough apples. The perimeter is the garden side multipled by 4.

```
class Solution {
public long minimumPerimeter(long neededApples) {
long low = 2, high = Math.min(neededApples, 1000000);
if (high % 2 == 1)
high--;
while (low < high) {
long mid = (high - low) / 2 + low;
if (mid % 2 == 1)
mid--;
long apples = countApples(mid);
if (apples < neededApples)
low = mid + 2;
else
high = mid;
}
return low * 4;
}
public long countApples(long side) {
long center = side / 2 * (side / 2 + 1);
long start = center + side + 1;
long end = center + (side + 1) * side / 2;
long total = (start + end) * side / 2 + center;
return total;
}
}
```