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

Пожалуйста, срочно помогите с задачей!

Тундер вар Ученик (101), на голосовании 1 месяц назад
Вот условие:
В Белоптичкинском кружке робототехников готовятся к районной конференции по киберфизике. На один из докладов школьники подготовили робота-попугая, очень похожего на природный прообраз. Умеет даже разговаривать, запоминая и повторяя звуки… Но беда в том, что за полнедели до выступления из строя вышел контроллер, отвечающий за функцию звукоподражания. Юные гении не растерялись и смогли собрать аналогичную схему. Но в её основе лежит более слабый контроллер, поэтому его дополнили тремя генераторами звука. Осталось написать драйвер.

На его вход передаётся сигнал длиной до 500 квантов, который необходимо повторить посредством активации трёх генераторов в определённом порядке. Для каждого из генераторов известен формируемый им сигнал и время восстановления между завершением генерации и повторной активацией. Все сигналы передаются в квантованном виде с одинаковой частотой дискретизации. Наложение сигналов производится сложением уровней.

Реализуйте описанный драйвер.

Формат входных данных: четыре блока с передаваемыми данными. Первый блок – в первой строке натуральное число N, длительность сигнала в квантах времени. Далее идёт N строк, в каждой из которых приводится вещественное число, уровень сигнала в соответствующий квант времени. Следующие три блока устроены одинаково и описывают генерируемые формы сигналов. Первая строка – два натуральных числа N и M через пробел, длительность формы и время восстановления в квантах времени. Далее идёт N строк, в каждой из которых приводится вещественное число, уровень генерируемой формы в соответствующий квант времени.

Формат выходных данных: в первой строке – натуральное число N, количество активаций генераторов. Далее идёт N строк, в каждой из которых идёт пара целых чисел. Первое число – номер кванта времени (нумерация с 0!), второе – номер активируемого генератора (1, 2, 3).

Решение принимается с оценкой в 50% за тест, если среднеквадратичная невязка относительно входного сигнала составит не более 50 единиц. Для полного балла необходима невязка не более 10 единиц.
Голосование за лучший ответ
Cogni Просветленный (46614) 2 месяца назад
 import sys 
import math

def read_signal():
N = int(sys.stdin.readline())
signal = [float(sys.stdin.readline()) for _ in range(N)]
return N, signal

def read_generator():
N, M = map(int, sys.stdin.readline().split())
waveform = [float(sys.stdin.readline()) for _ in range(N)]
return {'N': N, 'M': M, 'waveform': waveform}

def main():
# Чтение входных данных
desired_N, desired_signal = read_signal()
generators = [read_generator() for _ in range(3)]

# Инициализация
generated_signal = [0.0] * desired_N
activations = []
last_activation = [-math.inf] * 3 # Время последней активации для каждого генератора

for t in range(desired_N):
# Вычислить текущую ошибку
current_error = desired_signal[t] - generated_signal[t]
if abs(current_error) < 1e-6:
continue # Нет необходимости добавлять сигнал

# Выбрать генератор, который может улучшить ошибку наиболее
best_improvement = 0
best_gen = -1
best_activation = None

for i, gen in enumerate(generators):
# Проверить доступность генератора
if t >= last_activation[i] + gen['M']:
# Проверить, не выйдет ли генерация за пределы сигнала
if t + gen['N'] > desired_N:
continue
# Вычислить улучшение
improvement = 0
for j in range(gen['N']):
if t + j >= desired_N:
break
improvement += abs(gen['waveform'][j])
if improvement > best_improvement:
best_improvement = improvement
best_gen = i
best_activation = t

if best_gen != -1:
# Активировать генератор
activations.append((best_activation, best_gen + 1))
last_activation[best_gen] = best_activation
# Добавить сигнал генератора
for j in range(generators[best_gen]['N']):
if best_activation + j >= desired_N:
break
generated_signal[best_activation + j] += generators[best_gen]['waveform'][j]

# Вычислить среднеквадратичную невязку
mse = 0.0
for t in range(desired_N):
diff = desired_signal[t] - generated_signal[t]
mse += diff * diff
mse = math.sqrt(mse / desired_N)

# Вывод результатов
print(len(activations))
for act in activations:
print(act[0], act[1])
# Для отладки можно вывести mse
# print("MSE:", mse, file=sys.stderr)

if __name__ == "__main__":
main()
Похожие вопросы