1471 - Mergulho

Aqui podemos usar tanto vetores quanto conjuntos para ver quem não sobreviveu.

Descrição

Solução

Podemos considerar dois caminhos: um usando vetor e outro usando conjuntos.

Pela solução com vetor, podemos utilizar um de N posições, onde N é o número de voluntários, para guardar informação sobre quais sobreviveram e quais não, assumindo que, a princípio ninguém voltou, mas marcando verdadeiro para cada mergulhador que for lendo. Se o número de mergulhadores que retornaram é o mesmo que o número de voluntários, então imprimimos apenas um asterisco. Se o número for menor, precisamos percorrer o vetor imprimindo todos os índices cujo valor seja falso.

Pela solução com conjunto, podemos criar um conjunto que inicialmente contem todos os voluntários de 1 a N e ir removendo os voluntários que voltarem da missão, imprimindo os que não sobreviveram ao final da leitura. Mas é importante notar que essa solução só é válida em linguagens que ordenam os elementos do conjunto. Nas soluções exibidas abaixo, veja as alternativas que eu escolhi para cada linguagem suportada aqui.

Não é necessário fazer o tratamento da saída com espaço entre elementos, o problema pede para que você sempre inclua um espaço após todo mergulhador que não sobreviveu.

#include <string.h>
#include <stdio.h>

int main(){
    int N, R, mergulhador;
    int voluntarios[10001];

    while(scanf("%d %d", &N, &R) != EOF){
        memset(voluntarios, 0, sizeof(voluntarios));

        for(int i = 0; i < R; ++i){
            scanf("%d", &mergulhador);
            voluntarios[mergulhador] = 1;
        }

        if(N == R){
            printf("*\n");
        }else{
            for(int i = 1; i <= N; ++i){
                if(!voluntarios[i]) printf("%d ", i);
            }
            printf("\n");
        }
    }

    return 0;
}

Last updated