V Copa PUC-SP de Programação São Paulo, 12 de setembro de 2004 Sessão de aquecimento A: O atirador chinês Arquivo: sifu.[c|cpp|java] O atirador chinês Wang Sifu (na verdade é Jifu, mas foi impossı́vel resistir à piada) conquistou a primeira medalha de ouro da Olimpı́ada de Atenas, na prova de pistola de ar de dez metros. A contagem de pontos da pistola de ar é muito interessante. Cada atirador faz três séries de 100 tiros. Os tiros que acertam o alvo contam com um ponto positivo, e os que erram, um ponto negativo. No final da série o atirador recebe do juiz o número de pontos da série. Para a classificação conta a melhor das três séries. Neste problema você deve fazer um programa que recebe os resultados dos vários competidores e, para cada um, imprime o número de pontos que ele fez. Entrada Na entrada são dadas várias instâncias. Cada instância é dada através de uma linha, com três inteiros, representando os resultados do competidor nas três séries. A entrada termina com 0 0 0. Saı́da Para cada competidor você deverá imprimir uma linha com o texto Instancia i (onde i = 1, . . . , n) seguido de uma linha com o número de pontos conforme a regra da competição. As instâncias devem ser separadas por um espaço em branco. Exemplo Entrada 41 100 21 12 29 42 0 0 0 Saı́da Instancia 1 100 Instancia 2 42 B: O primeiro programa Arquivo: sumit.[c|cpp|java] Dizem que todos os cursos de introdução à computação do mundo começam com um programa que imprime a frase “Hello world”. Na China as coisas são diferentes. Lá o primeiro programa de um curso de introdução é aquele que lê uma seqüência de números diferentes de zero seguida por um zero e imprime a soma dos positivos. Sua tarefa é resolver este famoso problema. Entrada São dadas várias instâncias. Cada uma é apresentada em uma linha, através de vários números, terminados por um zero. A entrada termina com uma linha com um único zero. Saı́da Para cada instância da entrada, você deverá imprimir a mensagem Instancia i, onde i é o número da instância, seguida por uma linha com o valor da soma dos números positivos dados (truncado em 2 casas decimais). Exemplo Entrada 45.1 12 -7.3 0 4.003 3.003 2.002 1 0 0 Saı́da Instancia 1 57.10 Instancia 2 10.00 /* Exemplo de código C para o problema sumit */ #include <stdio.h> int main(void) { int inst=0; double i, soma; while(42) { scanf("%lf", &i); if(!i) break; soma = 0.; while(i) { if(i>0.) soma += i; scanf("%lf", &i); } printf("Instancia %d\n%.2lf\n\n", ++inst, (double)((int)(soma*100.))/100.); } return 0; } /* Exemplo de código Java para o problema sumit */ import java.util.*; import java.io.*; import java.lang.*; class sumit { public static void main(String args[]) throws Exception { sumit a = new sumit(); a.doBegin(); } final int MAXLINHA = 500000; StringTokenizer st = null; String ReadLn (int maxLg) { byte lin[] = new byte [maxLg]; int lg = 0, car = -1; try { while (lg < maxLg) { car = System.in.read(); if (car < 0 || car == ’\n’ || car == ’\r’) break; lin [lg++] = (byte) car; } } catch (IOException e) { return null; } if ((car < 0) && (lg == 0)) return null; return new String (lin, 0, lg); } String readPalavra() throws FimDaEntrada { while(st == null || !st.hasMoreTokens()) { String s = ReadLn(MAXLINHA); if (s == null) throw new FimDaEntrada(); st = new StringTokenizer(s); } return st.nextToken(); } double readDouble() throws FimDaEntrada { return Double.parseDouble(readPalavra()); } int readInt() throws FimDaEntrada { return (int) readDouble(); } // continua na próxima página // continuaç~ ao da classe sumit String doubleToPrint(double d, int trunc) { int i = (int) d; d = d - i; StringBuffer s = new StringBuffer(i + "."); for(int j=0; j<trunc; j++) { d *= 10; i = (int) d; s.append(i); d = d - i; } return s.toString(); } void doBegin() { double i; int inst=0; try { while(true) { i = readDouble(); if(i == 0) break; double soma = 0; while(i != 0) { if(i>0) soma += i; i = readDouble(); } inst++; System.out.println("Instancia " + inst); System.out.println(doubleToPrint(soma,2) + "\n"); } } catch(FimDaEntrada f) { System.out.println("Fim da entrada inesperado"); } } } class FimDaEntrada extends Exception { FimDaEntrada() { super(); } }