На питоне как решить задачу В первой строке содержится одно натуральное число N ( 2 ≤ N ≤ 10 5 ) — число номеров вопросов в списке. Вторая строка содержит N натуральных чисел — перестановку номеров вопросов из старого списка.
Ответ нейросети
03 октября 2025 19:54
Классическая задача с перестановкой такая: дан размер массива N и сама перестановка p из чисел 1..N. В зависимости от формулировки часто требуется:
- найти обратную перестановку (для каждого номера старого списка узнать его позицию в новом списке);
- или получить новый порядок элементов исходного списка A: новый порядок = [A[p[i]-1] для i=1..N];
- или просто вывести саму перестановку (если она уже задаёт новый порядок старых номеров).
Ниже даю подробное решение на Python для двух самых частых вариантов. Выберите тот, который подходит под вашу задачу (или пришлите полное условие — адаптирую под него).
Общая подготовка
- Ввод: первая строка содержит N, вторая строка — N чисел, образующие перестановку p.
- Временная сложность: O(N), память O(N).
Вариант 1. Найти обратную перестановку (позиция каждого старого номера в новом списке) Задача: для каждого i от 1 до N найти позицию i в перестановке p. Результат — массив pos, где pos[i-1] = позиция числа i в p (1-based).
Пример: N=5, p=[3,1,4,5,2] → позиции: [2,5,1,3,4]
Код:
import sys
def solve():
data = sys.stdin.buffer.read().strip().split()
if not data:
return
it = iter(data)
n = int(next(it))
p = [int(next(it)) for _ in range(n)]
# pos[x-1] = позиция числа x в перестановке p (1-based)
pos = [0] * n
for i, val in enumerate(p, start=1):
pos[val - 1] = i
print(' '.join(map(str, pos)))
if __name__ == "__main__":
solve()
Как работает:
- проход по перестановке и запоминаем, на какой позиции встречается каждое число.
- выведем итоговую последовательность из N чисел.
Вариант 2. Получить новый порядок элементов исходного списка A (если дан A) Если у вас есть какой-то массив A из N элементов (например, номера вопросов старого списка), и permutation p задаёт новый порядок старых номеров, то новый список B можно получить так: B[i] = A[p[i]-1] для i = 1..N
Код-подсказка (нужен только A и p):
def apply_permutation(A, p):
# p — перестановка чисел 1..N
return [A[idx - 1] for idx in p]
Пример использования:
- A = ["Q1","Q2","Q3","Q4","Q5"]
- p = [3,1,4,5,2]
- B = ["Q3","Q1","Q4","Q5","Q2"]
Вариант 3. Просто проверить, является ли данная последовательность перестановкой 1..N Если нужно проверить корректность входной перестановки (сомнительно ли она содержит все числа 1..N без повторов), можно добавить простую проверку:
def is_permutation_of_1_to_n(p, n):
return sorted(p) == list(range(1, n+1))
Пример с полным входом
- Ввод: 5 3 1 4 5 2
- Вариант 1 (обратная перестановка): выводит 2 5 1 3 4
Если хотите, можно адаптировать код под точное задание. Пожалуйста, пришлите полный текст условия задачи (или скажите, какой именно результат вам нужно получить: обратная перестановка, reorder по A и т.д.), и я дам точное решение под ваш случай.
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



