# 3091. Apply Operations to Make Sum of Array Greater Than or Equal to k

## Description

You are given a positive integer k. Initially, you have an array nums = [1].

You can perform any of the following operations on the array any number of times (possibly zero):

• Choose any element in the array and increase its value by 1.
• Duplicate any element in the array and add it to the end of the array.

Return the minimum number of operations required to make the sum of elements of the final array greater than or equal to k.

Example 1:

Input: k = 11

Output: 5

Explanation:

We can do the following operations on the array nums = [1]:

• Increase the element by 1 three times. The resulting array is nums = [4].
• Duplicate the element two times. The resulting array is nums = [4,4,4].

The sum of the final array is 4 + 4 + 4 = 12 which is greater than or equal to k = 11.
The total number of operations performed is 3 + 2 = 5.

Example 2:

Input: k = 1

Output: 0

Explanation:

The sum of the original array is already greater than or equal to 1, so no operations are needed.

Constraints:

• 1 <= k <= 105

## Solutions

### Solution 1: Enumeration

We should put the copy operation (i.e., operation $2$) at the end to reduce the number of operations.

Therefore, we enumerate the number of times $a$ for operation $1$ in the range $[0, k]$, then the number of times $b$ for operation $2$ is $\left\lceil \frac{k}{a+1} \right\rceil - 1$. We take the minimum of $a+b$.

The time complexity is $O(k)$, where $k$ is the input positive integer $k$. The space complexity is $O(1)$.

• class Solution {
public int minOperations(int k) {
int ans = k;
for (int a = 0; a < k; ++a) {
int x = a + 1;
int b = (k + x - 1) / x - 1;
ans = Math.min(ans, a + b);
}
return ans;
}
}

• class Solution {
public:
int minOperations(int k) {
int ans = k;
for (int a = 0; a < k; ++a) {
int x = a + 1;
int b = (k + x - 1) / x - 1;
ans = min(ans, a + b);
}
return ans;
}
};

• class Solution:
def minOperations(self, k: int) -> int:
ans = k
for a in range(k):
x = a + 1
b = (k + x - 1) // x - 1
ans = min(ans, a + b)
return ans


• func minOperations(k int) int {
ans := k
for a := 0; a < k; a++ {
x := a + 1
b := (k+x-1)/x - 1
ans = min(ans, a+b)
}
return ans
}

• function minOperations(k: number): number {
let ans = k;
for (let a = 0; a < k; ++a) {
const x = a + 1;
const b = Math.ceil(k / x) - 1;
ans = Math.min(ans, a + b);
}
return ans;
}


• impl Solution {
pub fn min_operations(k: i32) -> i32 {
let mut ans = k;
for a in 0..k {
let x = a + 1;
let b = (k + x - 1) / x - 1;
ans = ans.min(a + b);
}
ans
}
}