Make it Increasing (Codeforces 1667A)
Tags: Greedy, brute force

You are given an array $$$a$$$ consisting of $$$n$$$ positive integers, and an array $$$b$$$, with length $$$n$$$. Initially $$$b_i=0$$$ for each $$$1 \leq i \leq n$$$.In one move you can choose an integer $$$i$$$ ($$$1 \leq i \leq n$$$), and add $$$a_i$$$ to $$$b_i$$$ or subtract $$$a_i$$$ from $$$b_i$$$. What is the minimum number of moves needed to make $$$b$$$ increasing (that is, every element is strictly greater than every element before it)?

Input: The first line contains a single integer $$$n$$$ ($$$2 \leq n \leq 5000$$$).The second line contains $$$n$$$ integers, $$$a_1$$$, $$$a_2$$$, ..., $$$a_n$$$ ($$$1 \leq a_i \leq 10^9$$$) — the elements of the array $$$a$$$.

Output: Print a single integer, the minimum number of moves to make $$$b$$$ increasing.

Note: Example $$$1$$$: you can subtract $$$a_1$$$ from $$$b_1$$$, and add $$$a_3$$$, $$$a_4$$$, and $$$a_5$$$ to $$$b_3$$$, $$$b_4$$$, and $$$b_5$$$ respectively. The final array will be [$$$-1$$$, $$$0$$$, $$$3$$$, $$$4$$$, $$$5$$$] after $$$4$$$ moves.Example $$$2$$$: you can reach [$$$-3$$$, $$$-2$$$, $$$-1$$$, $$$0$$$, $$$1$$$, $$$2$$$, $$$3$$$] in $$$10$$$ moves.

Sample Inputs:
5
1 2 3 4 5

7
1 2 1 2 1 2 1

8
1 8 2 7 3 6 4 5

Sample Outputs:
4

10

16

Solution (Python):
def make_it(n, l):
    res = []
    for i in range(n):
        last = 0
        c = 0
        cn = 0
        for j in range(i + 1, n):
            c = last // l[j] + 1
            last = l[j] * c
            cn += c
        last = 0
        for k in range(i - 1, -1, -1):
            c = last // l[k] + 1
            last = l[k] * c
            cn += c
        res.append(cn)
    return min(res)
n = int(input())
l = list(map(int, input().split()))
print(make_it(n, l))

Solution (Python):
import bisect
import io
import math
import os
import sys
LO = 'abcdefghijklmnopqrstuvwxyz'
Mod = 1000000007

def gcd(x, y):
    while y:
        (x, y) = (y, x % y)
    return x
_input = lambda : sys.stdin.buffer.readline().strip().decode()
n = int(_input())
a = list(map(int, _input().split()))

def go(i):
    c = 0
    x = 0
    for j in range(i + 1, n):
        d = x // a[j] + 1
        x = a[j] * d
        c += d
    x = 0
    for j in range(i - 1, -1, -1):
        d = x // a[j] + 1
        x = a[j] * d
        c += d
    return c
print(min((go(i) for i in range(n))))

Solution (Python):
import math
n = int(input())
a = list(map(int, input().split()))
ans = float('inf')
for i in range(len(a)):
    temp = 0
    prev = 0
    if i - 1 >= 0:
        for j in range(i - 1, -1, -1):
            x = math.floor(prev / -a[j]) + 1
            prev = x * -a[j]
            temp += x
    prev = 0
    if i + 1 < n:
        for j in range(i + 1, n, 1):
            x = math.floor(prev / a[j]) + 1
            prev = x * a[j]
            temp += x
    ans = min(ans, temp)
print(ans)