Estou bastante familiarizado com o tratamento de entrada em configurações de Programação Competitiva, mas não consigo fazê-lo funcionar em Python para esse problema ( https://www.spoj.com/problems/MINDIST/ ) (minha solução funciona em C++, então o problema em si não está quebrado). Qual é a maneira padrão de ler a entrada na plataforma SPOJ?
Aqui está o que será alimentado ao stdin:
A primeira linha da entrada contém um único inteiro T, o número de casos de teste. Blocos T seguem.
Para cada caso de teste, a primeira linha contém dois inteiros separados por espaços N (1<=N<=100000) e S (0<=S<=100000000). N-1 linhas seguem, cada uma contém três inteiros X (1<=X<=N), Y (1<=Y<=N) e Z (1<=Z<=1000), denota que há uma aresta ponderada (não direcionada) Z entre o nó X e Y. A entrada está correta.
E um exemplo de entrada alimentada seria:
2
5 2
1 2 5
2 3 2
2 4 4
2 5 3
8 6
1 3 2
2 3 2
3 4 6
4 5 3
4 6 4
4 7 2
7 8 3
ERM:
Isso (apenas o tratamento de entrada) obtém "erro de tempo de execução, código de saída diferente de zero" (mas funciona localmente e em compiladores online como o ideone):
def get_int():
return int(input())
def get_ints():
return map(int, input().split())
T = get_int()
for _ in range(T):
N, S = get_ints()
for _ in range(N-1):
X, Y, Z = get_ints()
Parece que a get_ints()
chamada é o problema porque isto:
def get_int():
return int(input())
def get_ints():
return map(int, input().split())
T = get_int()
for _ in range(T):
N, S = 2, 3
for _ in range(N-1):
X, Y, Z = 1, 2, 3
recebe (como esperado) "resposta errada".
Não sei por que isso acontece.
Os dados de entrada na verdade contêm linhas em branco. Se eu apenas filtrá-los adicionando isso no topo, o veredito muda de "erro" para "resposta errada":
Considero a entrada deles inválida e o tratamento da sua entrada correto. As linhas em branco não deveriam estar lá, ou a descrição da entrada deles deveria mencioná-las. Do jeito que está escrito, elas não estão ok.
Eu descobri isso enviando algumas vezes com vários testes, por exemplo, armazenando os
split()
resultados em uma variável temporária e fazendowhile len(temp) != 2: pass
. Isso me deu "time limit exceeded", então eu sabia que o número de elementos na linha estava errado.