Top.Mail.Ru
Ответы

Помогите решить задачу python, ничего в голову не приходит

Алгоритм предназначен для сортировки массивов длиной n, состоящих из уникальных чисел в диапазоне от 0 до n-1. Иными словами, массив должен содержать целые положительные числа от 0 до n-1, перемешанные как угодно. Например, если n = 8, то массив может быть таким:

# Массив длиной 8 элементов
3 1 0 2 6 5 4 7 # В массиве содержатся все целые числа в диапазоне от 0 до 7.
Суть алгоритма: исходный массив разделяется на блоки так, чтобы каждый блок можно было отсортировать и при слиянии отсортированных блоков получился отсортированный массив. Менять блоки местами нельзя.

# Делим исходный массив на блоки, которые можно отсортировать:

# Так нельзя: после сортировки блоков их не объединить в отсортированный массив.
3 1 | 0 2 | 6 | 5 4 | 7

# И так нельзя.
3 | 1 0 2 | 6 5 4 7

3 1 0 2 | 6 5 4 | 7 # А вот такое деление - в самый раз!

# Сортируем блоки:
0 1 2 3 | 4 5 6 | 7

# Объединяем блоки:
0 1 2 3 4 5 6 7

# Получили отсортированный массив!
Алгоритм сортировки состоит из трёх шагов:

Разбить исходную последовательность на k блоков. Блоки могут иметь разные размеры. Первый блок обязательно должен содержать 0. Если длина первого блока — r элементов, то максимальным значением в первом блоке должно быть число r - 1. А следующий блок (если он вообще будет) должен содержать число r. Этот принцип должен соблюдаться и в последующих блоках.
Отсортировать каждый из блоков.
Объединить блоки в единый массив.
Такая сортировка выгодна в том случае, если разбить исходный массив на максимально возможное число блоков.

В этом задании вам предстоит реализовать только первый шаг: разбить массив на блоки и вернуть их количество.

Задание: написать программу, которая получает на вход массив и возвращает максимальное число блоков, на которое можно разбить этот массив так, чтобы сортировка отработала корректно.

Ещё один пример:

3 2 0 1 4 6 5
Минимальный размер первого блока — 4.

Если взять лишь первые два элемента, то отсортированная последовательность будет начинаться с двойки, а это неправильно. Если взять первые три элемента, то последовательность будет начинаться с нуля, но после него сразу же пойдёт двойка. Опять нехорошо.

А вот первые четыре элемента гарантируют, что первая часть результирующего массива будет корректной.

Четвёрку можно взять как отдельный блок из одного элемента.

Последние два элемента составят третий блок. Таким образом:

первый блок: 3, 2, 0, 1;
второй блок: 4;
третий блок: 6, 5.
В этом примере ответ равен 3: чтобы сортировка блоками отработала корректно, полученный массив можно разделить максимум на три блока.

Формат ввода
В первой строке задано n — количество чисел для сортировки (n ≤ 1000). В следующей строке записаны числа от 0 до n - 1, которые надо разбить на блоки.

Формат вывода
Выведите максимальное число блоков, на которое можно разбить данные при использовании метода частичной сортировки.

По дате
По рейтингу
Аватар пользователя
Новичок
123456789101112131415161718192021
 def max_blocks(arr): 
    n = len(arr) 
    max_block_count = 0  # Количество блоков 
    current_max = 0      # Максимальное значение в текущем блоке 
 
    for i in range(n): 
        current_max = max(current_max, arr[i]) 
        # Если индекс достиг максимального значения в текущем блоке, 
        # это означает, что мы можем завершить блок здесь. 
        if current_max == i: 
            max_block_count += 1 
            current_max = 0  # Сброс для следующего блока, если он есть 
 
    return max_block_count 
 
# Чтение ввода пользователя 
n = int(input())  # количество чисел для сортировки 
arr = list(map(int, input().split()))  # числа для сортировки 
 
# Вывод результата 
print(max_blocks(arr)) 
Аватар пользователя
Оракул

Обходите массив, контрольное число первое, пока очередное число меньше первого - игнор, все в блок, как только больше, счетчик + 1, контрольное число становится очередным - начало нового блока
Изи