# A non-empty array A consisting of N integers is given. A pair of integers (P, Q), such that 0 ≤ P < Q < N, is called
# a slice of array A (notice that the slice contains at least two elements). The average of a slice (P, Q) is the sum of
# A[P] + A[P + 1] + ... + A[Q] divided by the length of the slice. To be precise, the average equals
# (A[P] + A[P + 1] + ... + A[Q]) / (Q − P + 1).
#
# For example, array A such that:
#
#     A[0] = 4
#     A[1] = 2
#     A[2] = 2
#     A[3] = 5
#     A[4] = 1
#     A[5] = 5
#     A[6] = 8
# contains the following example slices:
#
# slice (1, 2), whose average is (2 + 2) / 2 = 2;
# slice (3, 4), whose average is (5 + 1) / 2 = 3;
# slice (1, 4), whose average is (2 + 2 + 5 + 1) / 4 = 2.5.
# The goal is to find the starting position of a slice whose average is minimal.
#
# Write a function:
#
# class Solution { public int solution(int[] A); }
#
# that, given a non-empty array A consisting of N integers, returns the starting position of the slice with the minimal average.
# If there is more than one slice with a minimal average, you should return the smallest starting position of such a slice.
#
# For example, given array A such that:
#
#     A[0] = 4
#     A[1] = 2
#     A[2] = 2
#     A[3] = 5
#     A[4] = 1
#     A[5] = 5
#     A[6] = 8
# the function should return 1, as explained above.
#
# Write an efficient algorithm for the following assumptions:
#
# N is an integer within the range [2..100,000];
# each element of array A is an integer within the range [−10,000..10,000].

def solution(A):
    g_min_avg = sum(A[:2]) / 2.0
    g_min_idx = 0
    # search by 2 steps
    for i in range(len(A) - 1):
        # print(i, g_min_idx, g_min_avg)
        l_min_avg = sum(A[i:i + 2]) / 2.0
        l_min_idx = i
        if l_min_avg < g_min_avg:
            g_min_avg = l_min_avg
            g_min_idx = l_min_idx

    # search by 3 steps
    for i in range(len(A) - 2):
        # print(i, g_min_idx, g_min_avg)
        l_min_avg = sum(A[i:i + 3]) / 3.0
        l_min_idx = i
        if l_min_avg < g_min_avg:
            g_min_avg = l_min_avg
            g_min_idx = l_min_idx

    return g_min_idx


assert solution([4, 2, 2, 5, 1, 5, 8]) == 1
# print(solution([5,4,3,2,1]))
assert solution([5, 4, 3, 2, 1]) == 3
assert solution([5, 4, 1, 2, 1]) == 2

