Programação Competitiva

Par ou Ímpar [OBI 2004]

Muitas crianças gostam de decidir todas as disputas através do famoso jogo de Par ou Ímpar. Nesse jogo, um dos participantes escolhe Par e o outro Ímpar. Após a escolha, os dois jogadores mostram, simultaneamente, uma certa quantidade de dedos de uma das mãos. Se a soma dos dedos das mãos dos dois jogadores for par, vence o jogador que escolheu Par inicialmente, caso contrário vence o que escolheu Ímpar.

Dada uma sequência de informações sobre partidas de Par ou Ímpar (nomes dos jogadores e números que os jogadores escolheram), você deve escrever um programa para indicar o vencedor de cada uma das partidas.

Entrada

A entrada é composta de vários conjuntos de testes. A primeira linha de um conjunto de testes contém um inteiro N (0 ≤ N ≤ 1000), que indica o número de partidas de Par ou Ímpar que aconteceram. As duas linhas seguintes contêm cada uma um nome de jogador. Um nome de jogador é uma cadeia de no mínimo um e no máximo dez letras (maiúsculas e minúsculas), sem espaços em branco. As N linhas seguintes contêm cada uma dois inteiros A e B que representam o número de dedos que cada jogador mostrou em cada partida (0 ≤ A ≤ 5 e 0 ≤ B ≤ 5). Em todas as partidas, o primeiro jogador sempre escolhe Par. O final da entrada é indicado por N = 0.

Saída

Para cada conjunto de teste da entrada, seu programa deve produzir a saída da seguinte forma. A primeira linha deve conter um identificador do conjunto de teste, no formato “Teste n”, onde n é numerado sequencialmente a partir de 1. As próximas N linhas devem indicar o nome do vencedor de cada partida. A próxima linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

Exemplo

Entrada Saída
3
Pedro
Paulo
2 4
3 5
1 0
2
Claudio
Carlos
1 5
2 3
0
Teste 1
Pedro
Pedro
Paulo

 

Teste 2
Claudio
Carlos

Solução em C

#include <stdio.h>

int main() {
    int partidas, i, cont, instancia = 0;
    int a, b, soma;

    scanf("%i", &partidas);

    while (partidas != 0){
        cont=0;
    	char jog1[11], jog2[11];
    	int ganhador[1000]; //0 ≤ N ≤ 1000

		scanf("%s %s", jog1, jog2);

        for(i = 0; i < partidas; i++)  {
            //faz a disputa
            scanf("%i %i", &a, &b);
            soma = a + b;
            
            //verifica quem ganhou
            if (soma % 2 == 0) {
            	ganhador[cont] = 1;
            } else {
            	ganhador[cont] = 2;
            }
            cont++;
        }

        instancia++;
        printf("Teste %i\n", instancia);

		//mostra o nome de quem ganhou cada disputa
        for(i = 0; i < cont; i++) {
        	if (ganhador[i] == 1) {
        		printf("%s\n", jog1);
        	} else {
        		printf("%s\n", jog2);
        	}
        }

		printf("\n");

		//lê uma nova quantidade de disputas
        scanf("%i", &partidas);
    }

	return 0;
}

Teste o código: http://ideone.com/5uhC1L

Solução em C++

Apenas para dar uma diferenciada com relação a solução em C, foi utilizada a classe vector em vez de um array primitivo (o vetor). Também foi utilizado o desvio condicional ternário em vez do if, mas o funcionamento é o mesmo.

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int partidas, instancia = 0;
    int a, b, soma;
    cin >> partidas;

    while (partidas != 0) {
        char jog1[11], jog2[11];
        cin >> jog1 >> jog2;

        vector<int> ganhador;

        for(int i = 0; i < partidas; i++) {
            cin >> a >> b;
            soma = a + b;
            ganhador.push_back((soma % 2 == 0) ? 1 : 2); //operador if ternário
        }

        instancia++;
        cout << "Teste " << instancia << endl;

        for(int i = 0; i < ganhador.size(); i++) {
            printf("%s\n", (ganhador.at(i) == 1) ? jog1 : jog2);
        }

        cout << "\n";

        cin >> partidas;
    }

    return 0;
}

Teste o código: http://ideone.com/klIyMg

Sair da versão mobile