Eu decidi enviar minha resposta anterior na página da contudo, mas não ultrapassou o limite de tempo de execução. Optei por reescrever utilizando os valores primitivos para tornar o processo mais rápido. Agora, todos os testes foram bem-sucedidos.
public class escada {
public static int[] lerEntrada() {
Scanner scanner = new Scanner(System.in);
int tamanho = Integer.parseInt(scanner.nextLine()); // Nao preciso da primeira linha contendo o tamanho dos numeros
String linha = scanner.nextLine();
String[] inputArray = linha.split("\\s+");
try {
int[] resultado = new int[tamanho];
for (int i = 0; i < tamanho; i++) {
resultado[i] = Integer.parseInt(inputArray[i]);
}
return resultado;
} catch (NumberFormatException e) {
System.err.println("Entrada invalida " + e.getMessage());
System.exit(-1);
}
return new int[0];
}
public static void main(String[] args) {
int[] escada = lerEntrada();
System.out.println(EscadaPerfeitaFast.calcular(escada));
}
static class EscadaPerfeitaFast {
static int calcular(final int[] sequencia) {
var progressaoAritimetica = progressaoAritimetica(sequencia);
if (progressaoAritimetica == null) {
return -1;
}
return calcularNumeroDeMovimentos(sequencia, progressaoAritimetica);
}
private static int calcularNumeroDeMovimentos(int[] escada, int[] escadaPerfeita) {
int soma = 0;
for (int i = 0; i < escada.length; i++) {
int movimentos = escada[i] - escadaPerfeita[i];
if (movimentos > 0) {
soma += movimentos;
}
}
return soma;
}
private static int[] progressaoAritimetica(int[] sequencia) {
long somaSequencia = somarSequencia(sequencia);
int primeiroTermoProgressaoAritimetica = calcularPrimeiroTermoProgressaoAritimetica(sequencia);
if (somarProgressaoAritimetica(primeiroTermoProgressaoAritimetica, sequencia.length) == somaSequencia) {
return gerarProgressaoLinear(primeiroTermoProgressaoAritimetica, sequencia.length);
}
return null;
}
private static int calcularPrimeiroTermoProgressaoAritimetica(int[] escada) {
int s = (int) somarSequencia(escada);
int n = escada.length;
return (2 * s - (n * n) + n) / (2 * n);
}
private static int[] gerarProgressaoLinear(int inicio, int tamanho) {
var resultado = new int[tamanho];
for (int i = 0; i < tamanho; i++) {
resultado[i] = inicio + i;
}
return resultado;
}
private static long somarProgressaoAritimetica(int primeiroTermo, int tamanho) {
double n = tamanho;
double a = primeiroTermo;
double sum = (n/2) * ((2 * a ) + (n - 1));
return (long) sum;
}
private static long somarSequencia(int[] sequencia) {
long soma = 0;
for (int i = 0; i < sequencia.length; i++) {
soma += sequencia[i];
}
return soma;
}
}
}