Aquecimento - PUC-SP

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