10933 - Volleyball

All about problems in Volume 109. If there is a thread about your problem, please use it. If not, create one with its number in the subject.

Moderator: Board moderators

Post Reply
txomin2091
New poster
Posts: 1
Joined: Fri Feb 17, 2017 7:22 pm

10933 - Volleyball

Post by txomin2091 » Sun Jan 07, 2018 12:51 pm

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 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("");
        }
    }    
}

Post Reply

Return to “Volume 109 (10900-10999)”