## 10933 - Volleyball

Moderator: Board moderators

txomin2091
New poster
Posts: 4
Joined: Fri Feb 17, 2017 7:22 pm

### 10933 - Volleyball

I have more than 30 submissions trying fix a RTE result. Delimiting different parts of the program, I know that the RTE problem resides into de Integer.parseInt() method to obtain the points of each set played.

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()); //(**)

...
}``````
This runs OK on all tests cases including uDebug, but obtaining RTE in the (**) lines, I tried a more complex method, asumming spaces "anywhere":

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('-');
}``````
(I know it's not an efficient method but I'm just looking for the solution)
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 setPerdidos;
int puntos;

public Equipo(String nombre) {
this.nombre = nombre;
}

@Override
public int compareTo(Equipo t) {
} else return -Integer.compare(puntos,t.puntos);
}

@Override
public String toString() {
}

}

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"

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
} else {
// e1 gana e2 partido
}
e1.puntos+=tp1;
e1.setPerdidos+=se2;

e2.puntos+=tp2;
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) {