(UVA) 10137 - The Trip - Solução

import java.io.*;
import java.util.*;
import java.lang.Math;
import java.text.NumberFormat;
import java.text.DecimalFormat;  
import java.text.DecimalFormatSymbols;
import java.math.*;

class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        Main processando = new Main();
        processando.takeInput();
       
        System.exit(0);
    }
   
    void takeInput() throws NumberFormatException, IOException {
        String line = "";
       
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       
        while ((line = br.readLine()) != null) {
            StringTokenizer tokenizer = new StringTokenizer(line);
            Integer qteEntradas = Integer.parseInt(tokenizer.nextToken());
           
            ArrayList<Integer> qteGasta = new ArrayList<Integer>();
           
            if (qteEntradas == 0) {
                return;
            }
           
            Integer i;
            Integer soma = 0;
            for (i = 0; i < qteEntradas; i++) {
                String leGastos = br.readLine();
                tokenizer = new StringTokenizer(leGastos);               
           
                // Transforma entrada para Integer e adiciona no Array
                qteGasta.add((int)(Double.parseDouble(tokenizer.nextToken())*100+0.1));

                // Calcula a quantidade gasta pelos viajantes
                soma += qteGasta.get(i);
            }
           
            // Calcula gasto médio
            Integer media = soma/qteEntradas;

            // Verifica quantas pessoas podem receber $0,01 a mais
            Integer ficaUmAcima = soma%qteEntradas;
            Integer ficaUmAbaixo = qteEntradas - ficaUmAcima;
           
            // Verifica qual vai ser o valor a ser trocado entre os viajantes
            soma = 0;
            for (i = 0; i < qteEntradas; i++) {
               
                // Se a pessoa gastou menos do que a média gasta
                if ((qteGasta.get(i) - media) <= 0) {
                    // Ela tem que atingir no mínimo a média
                    soma += Math.abs(qteGasta.get(i) - media);
                    // A pessoa só é propensa a ganhar $0,01 se não tem mais quem ficaUmAbaixo
                    if (ficaUmAbaixo <= 0) {
                        soma += 1;
                    }
                   
                    // Menos uma pessoa a ganhar menos
                    ficaUmAbaixo--;
                }
                           
            }
           
            // Para poder criar os centavos da resposta
            String cents = String.valueOf(soma%100);
            if (soma%100 < 10) {
                cents = "0" + cents;
            }
           
            System.out.println("$" + (soma/100) + "." + cents);
               
        }
           
        return;
    }
}

Comments

Popular posts from this blog

(Coderbyte) Dash Insert II - Solução

(Coderbyte) Run Length - Solução

(Coderbyte) Counting Minutes I - Solução