Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Решить задачу на питон С++ или джава

Festik Festikovich Ученик (97), закрыт 1 месяц назад
Иннокентий работает в отделе сортировки перестановок, подотделе сортировки вставками. Его задача заключается в сортировке перестановок, предоставленных заказчиками. Перестановкой длины n называется такая последовательность чисел, в которой встречаются все числа от 1 до n без повторений в некотором порядке.

Перестановка считается отсортированной, если в ней все числа расположены по возрастанию, то есть она имеет вид 1, …, n.

Иннокентий начинает рабочий день с пустой последовательности чисел. За день он сортирует вставками перестановку длины n. В начале каждой операции вставки он получает очередное число ai из перестановки заказчика, после чего обрабатывает его, вставляя в отсортированную последовательность из ранее полученных чисел. После каждого такого добавления, последовательность уже обработанных чисел должна быть отсортирована по возрастанию.

Перед тем как вставить число ai в последовательность, он может выбрать с какого края последовательности начать вставку. Далее он устанавливает число ai с этого края и последовательно меняет вставляемое число с рядом стоящим числом bj до тех пор, пока число ai не встанет на свое место. На каждую перестановку вставляемого числа ai с числом bj Иннокентий тратит bj единиц энергии.

Вам дана перестановка длины n из чисел ai в том порядке, в котором Иннокентий их будет обрабатывать. Подскажите ему, какое минимальное количество энергии ему потребуется потратить, чтобы отсортировать всю перестановку.

Формат ввода
В первой строке находится одно целое число n — длина перестановки. 1 ≤ n ≤ 2 * 105.

Во второй строке содержится n целых чисел ai через пробел в том порядке, в котором они поступают на обработку Иннокентию. Гарантируется, что эти числа образуют перестановку длины n, то есть каждое число от 1 до n содержится в заданном наборе ровно один раз.

Формат вывода
Вывести одно число — минимальные суммарные энергозатраты Иннокентия для сортировки вставками заданной на входе перестановки.

Пример
Ввод
9
2 9 1 5 6 4 3 8 7
Вывод
43

Гптэшка фигово решает данную задачу помогите сам не могу уже
Лучший ответ
ауцыв уафсыв Гуру (4835) 1 месяц назад
 class FenwickTree: 
def __init__(self, size):
self.n = size + 2 # Accommodate 1-based indexing
self.tree = [0] * self.n

def update(self, idx, value):
idx += 1 # Convert to 1-based indexing
while idx < self.n:
self.tree[idx] += value
idx += idx & -idx

def query(self, idx):
idx += 1 # Convert to 1-based indexing
result = 0
while idx > 0:
result += self.tree[idx]
idx -= idx & -idx
return result

def main():
import sys

n = int(sys.stdin.readline())
ai_list = list(map(int, sys.stdin.readline().split()))
max_ai = max(ai_list) + 2 # Ensure the tree is large enough

total_cost = 0
total_sum = 0

sums_BIT = FenwickTree(max_ai)

for ai in ai_list:
ai_idx = ai # Since ai ranges from 1 to n

# Sum of elements less than ai
sum_less = sums_BIT.query(ai_idx - 1)
# Sum of elements greater than ai
sum_greater = total_sum - sums_BIT.query(ai_idx)

cost_right = sum_less # Cost when inserting from the right
cost_left = sum_greater # Cost when inserting from the left

total_cost += min(cost_left, cost_right)

sums_BIT.update(ai_idx, ai)
total_sum += ai

print(total_cost)

if __name__ == "__main__":
main()
Festik FestikovichУченик (97) 1 месяц назад
спасибо
ivan866_zПросветленный (20244) 1 месяц назад
это самое оптимальное решение данного типа деревьев?
Остальные ответы
Максим-'емае Калашников Знаток (273) 1 месяц назад
В вашем коде есть несколько ошибок, которые необходимо исправить:

1. Используйте math.log() вместо math.lg(): В модуле math нет функции lg(). Если вы хотите взять логарифм по основанию 10, используйте math.log10(), или math.log() для натурального логарифма.

2. Проверка аргументов для math.asin(): Функция math.asin() принимает аргумент только в диапазоне от -1 до 1. Поэтому перед его использованием следует убедиться, что значение, передаваемое в нее, находится в этом диапазоне. В противном случае программа приведет к ошибке.

3. Справочная документация: Убедитесь, что значения, которые вы передаете в math.asin() и math.log(), действительны и не приводят к ошибкам вычисления.

Вот исправленный вариант кода:


import math

x = float(input('Введите x: '))

# Вычисляем значение под корнем
value_asin = 5 <strong> ((2 * x) </strong> 2 + (5 * x) + 2)
# Проверка значения для asin
if -1 <= value_asin <= 1:
asin_result = math.asin(value_asin)
else:
asin_result = float('nan') # Делаем результат NaN, если значение вне диапазона

# Вычисляем логарифм
try:
log_result = math.log((x ** 2 + (5 * x) + 6) / (x + 2))
except ValueError as e:
log_result = float('nan') # Обработка ошибки, если логарифм не может быть вычислен

# Результат
y = asin_result + log_result
print(y)


В этом исправленном коде:
- Мы проверяем, находится ли value_asin в диапазоне от -1 до 1 перед вызовом math.asin().
- Используем math.log(), чтобы взять натуральный логарифм (или math.log10() для логарифма по основанию 10).
- Добавлена обработка исключения для math.log() для предотвращения выдачи ошибки, если расчет приводит к недопустимому значению.
Festik FestikovichУченик (97) 1 месяц назад
спасибо
Похожие вопросы