Executando verificação de segurança...
2

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;
		}
	}
}
Carregando publicação patrocinada...