Essa foi a solução que eu encontrei. Testei apenas para os valores informados e não está muito bem escrito. Porém, espero que possa ajudar a entender como encontrar a sua solução.

Obs.: eu acho que o problema da sua solução é que você não sabe quantos blocos vai na primeira coluna, caso soubesse era, de fato, ir somando 1 à cada coluna. Além disso, se encontrar algum erro na minha solução seria ótimo saber.

def minBlocks(columns):
    min_blocks = 0
    for i in range(columns):
        min_blocks += i + 1

    return min_blocks


def buildStair(columns: int, block_list: list):
    min_blocks = minBlocks(columns)
    block_count = sum(block_list)
    blocksLeft = block_count - min_blocks

    if block_count < min_blocks or not (blocksLeft % columns == 0):
        print("Impossível montar escada")
        return

    stair = []
    for i in range(columns):
        if (i == 0):
            stair.append(1)
        else:
            stair.append(stair[i-1] + 1)

    leftForEachColumn = blocksLeft // columns
    stair = list(map(lambda x: x + leftForEachColumn, stair))

    return stair


def movedBlocks(block_list: list, stair: list):
    movedBlocks = 0
    columns = len(stair)

    for column in range(columns):
        movedBlocks += abs(block_list[column] - stair[column])

    return movedBlocks // 2


blockList = [5, 4, 5, 4, 2]
stair = buildStair(5, blockList)
print(stair)
if stair:
    print(movedBlocks(blockList, stair))

blockList = [9, 8, 7, 6, 5, 4]
stair = buildStair(6, blockList)
print(stair)
if stair:
    print(movedBlocks(blockList, stair))

blockList = [1, 5]
stair = buildStair(2, blockList)
print(stair)
if stair:
    print(movedBlocks(blockList, stair))