Initially, I have used string.split() method assuming that the input format was
"team1-team2: n1-n2 n3-n4 ..." whitout spaces previous or after the '-'. The code was
Code: Select all
// s is a String containing something like "23-25 28-26 25-0" or more sets
String f[]=s.split("(\\s)+");
for (j=0; j<f.length; j++) { // recorrer los sets
//p1=p2=0;
k=f[j].indexOf('-');
p1=Integer.parseInt(f[j].substring(0,k).trim()); //(**)
p2=Integer.parseInt(f[j].substring(k+1).trim()); //(**)
...
}
Code: Select all
// s is a String containing something like " 23 - 25 28 - 26 25-0" or more sets
k=s.indexOf('-');
while (k>=0) {
//p1=p2=0;
p1=Integer.parseInt(s.substring(0,k).trim()); //(*)
s=s.substring(k+1).trim();
j=s.indexOf(' ');
if (j>=0) {
p2=Integer.parseInt(s.substring(0,j).trim()); //(*)
s=s.substring(j+1).trim();
} else {
p2=Integer.parseInt(s.trim()); //(*)
s="";
}
...
// NO evita el RTE: if (se1==3 || se2==3) break; // leo solo los necesarios
k=s.indexOf('-');
}
as in the previous code, I obtain RTE in the Integer.parseInt lines.
In both cases, initializing p1=p2=0 and commenting the Integer.parseInt lines the result is WA, not RTE.
I have tried other possibilities such as reducing the treated set until a team reaches 3 winned sets and ignoring the rest of the entry, or use Long instead of Integer for points, but the result, stubbornly, remains RTE.
some help ? Is it possible that one of the cases tested by the Judge has the wrong formated input or wrong formated input for Java ?
regards
Code: Select all
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Scanner;
class Main_S10933_Volleyball { // _S10933_Volleyball
class Equipo implements Comparable<Equipo> {
String nombre;
int ganados;
int setGanados;
int setPerdidos;
int puntos;
public Equipo(String nombre) {
this.nombre = nombre;
ganados=setGanados=setPerdidos=puntos=0;
}
@Override
public int compareTo(Equipo t) {
// ordenar por partidos_ganados, sets_ganados-sets_perdidos, puntos
if (ganados==t.ganados) {
if (setGanados-setPerdidos==t.setGanados-t.setPerdidos) {
return -Integer.compare(setGanados-setPerdidos,t.setGanados-t.setPerdidos);
} else return -Integer.compare(puntos,t.puntos);
} else return -Integer.compare(ganados,t.ganados);
}
@Override
public String toString() {
return nombre+": "+ganados+" "+setGanados+" "+setPerdidos+" "+puntos;
}
}
public static void main(String[] args) throws FileNotFoundException {
Main_S10933_Volleyball miProg=new Main_S10933_Volleyball();
miProg.run();
}
private void run() throws FileNotFoundException {
Scanner in;
in = new Scanner(System.in);
boolean traza=false;
HashMap<String, Equipo> hm;
ArrayList<Equipo> ar;
Equipo e1,e2;
String s,ne,f[];
int n,M,i,j,k,se1,se2,tp1,tp2;
long p1,p2;
while (true) {
s=in.nextLine().trim();
while (s.isEmpty()) s=in.nextLine().trim();
n=Integer.parseInt(s);
if (n==0) break;
// nuevo caso de prueba
hm=new HashMap<>();
for (i=0; i<n; i++) { // tomar los nombres y crear los equipos
s=in.nextLine().trim();
while (s.isEmpty()) s=in.nextLine().trim();
hm.put(s,new Equipo(s));
}
s=in.nextLine().trim();
while (s.isEmpty()) s=in.nextLine().trim();
if (traza) System.out.println("debe ser M:"+s);
M=Integer.parseInt(s.trim());
for (i=0; i<M; i++) {
s=in.nextLine().trim();
while (s.isEmpty()) s=in.nextLine().trim();
// tomar el objeto del primer equipo
j=s.indexOf('-');
ne=s.substring(0,j).trim();
e1=hm.get(ne);
//if (traza) System.out.println("e1 "+e1);
// tomar el objeto del segundo equipo
k=s.indexOf(':');
ne=s.substring(j+1,k).trim();
e2=hm.get(ne);
//if (traza) System.out.println("e2 "+e2);
// separa y recorrer los marcadores de set
s=s.substring(k+1).trim();
if (traza) System.out.println(e1.nombre+" "+e2.nombre+" SETs: "+s);
//if (!traza) continue; // pare ver si el RTE es a partir de esta posicion
if (!s.isEmpty()) {
// ejemplo: s="24 - 26 35-37 0 - 25"
if (traza) System.out.println("tratar resultados '"+s+"'");
s=s.replaceAll("\t"," "); // !! visto en algun caso en el foro
se1=se2=tp1=tp2=0; // numero de sets y total puntos
/*
// primer metodo para extraer los puntos de cada set
// da RTE si no comento las lineas (**) !!
f=s.split("(\\s)+"); // e.r.: uno o mas espacios
if (traza) System.out.println("'"+s+"' "+f.length+" "+Arrays.toString(f));
for (j=0; j<f.length; j++) { // recorrer los sets
//p1=p2=0;
k=f[j].indexOf('-');
p1=Integer.parseInt("0"+f[j].substring(0,k).trim()); //(**)
p2=Integer.parseInt("0"+f[j].substring(k+1).trim()); //(**)
tp1+=p1; // total puntos equipo e1
tp2+=p2; // total puntos equipo e2
if (p1>p2) se1++; // gana el set el equipo e1
else se2++; // gana el set el equipo e2
}
*/
// segundo metodo para tratar las puntuaciones de los sets
// da igual los blancos que existan y donde
// pero RTE si no comento las lineas (*)
k=s.indexOf('-');
while (k>=0) {
//p1=p2=0;
if (traza) System.out.println(" tratando <"+s+">");
p1=Integer.parseInt(s.substring(0,k).trim()); //(*)
s=s.substring(k+1).trim();
j=s.indexOf(' ');
if (j>=0) {
p2=Integer.parseInt(s.substring(0,j).trim()); //(*)
s=s.substring(j+1).trim();
} else {
p2=Integer.parseInt(s.trim()); //(*)
s="";
}
tp1+=p1;
tp2+=p2;
if (p1>p2) se1++; // e1 gana el set
else se2++; // e2 gana el set
// NO evita el RTE: if (se1==3 || se2==3) break;
k=s.indexOf('-');
}
if (se1>se2) {
// e1 gana el partido
e1.ganados++;
} else {
// e1 gana e2 partido
e2.ganados++;
}
e1.puntos+=tp1;
e1.setGanados+=se1;
e1.setPerdidos+=se2;
e2.puntos+=tp2;
e2.setGanados+=se2;
e2.setPerdidos+=se1;
}
if (traza) System.out.println("e1 "+e1);
if (traza) System.out.println("e2 "+e2);
}
if (hm.size()>0) { // evitar posibilidad M=0
// ordenar y listar la clasifiación
ar=new ArrayList<>(hm.values());
Collections.sort(ar);
for (Equipo e: ar) {
System.out.printf("%-20s%5d%5d%10d\n",e.nombre,e.ganados,e.setGanados-e.setPerdidos,e.puntos);
}
}
System.out.println("");
}
}
}