Você pode determinar a melhor programação usando uma fila de prioridades . Onde estão os momentos de decisão no agendamento? É quando você tem mais de um ciclo para começar em qualquer segundo.
Você precisará ter um tipo de dados de "agendamento" que represente uma possível programação (os dados que você escreveu acima são um exemplo perfeito dos dados que você representa aqui).
Portanto, o pseudo-algoritmo deve ser o seguinte:
Adicione cada tipo de ciclo ao seu próprio agendamento e empurre cada agendamento para uma fila de prioridade, priorizando pelo menor valor GCD * (C1, ..., Cn) / n.
Em seguida, começando com o agendamento com o menor valor de GCD * (C1, ..., Cn) / n, crie novos agendamentos do antigo adicionando novos ciclos ao lançamento.
Continue o quanto quiser.
Você decide quando a programação deve terminar e, como é uma fila de prioridade, você tem a garantia de que o primeiro elemento é o ideal em termos de GCD * (C1, ..., Cn) / n em um determinado ponto .
Espero que ajude.