1267 - Biblioteca Pascal

Mais um dia, mais um problema Ad Hoc...

Descrição

Solução

Uma maneira fácil de resolver este problema envolve guardar a quantidade de jantares em que todos os alunos participaram e no final verificar se alguém tem o número de jantares igual ao número total. Tal solução é viável porque sabemos que o limite de jantares e alunos é pequeno.

Outra possível solução envolveria assumir que todos os alunos participaram de todos os jantares e ir alterando o julgamento caso se prove que um aluno não foi a um determinado jantar. O principal problema com essa abordagem para esse problema específico é que pode-se economizar tempo se conseguirmos provar que nenhum aluno foi em todos, terminando o programa sem ler todas as entradas. Infelizmente, isso traz riscos, já que em uma mesma execução temos diversos casos de teste.

Mitigar esse risco é possível, mas só traria mais dificuldade na implementação. Neste caso, ficamos com a primeira ideia mesmo.

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

int main(){
    int jantares[101];
    int N, D, x, resposta;

    while(scanf("%d %d", &N, &D)){
        if(!N && !D)    break;

        memset(jantares, 0, sizeof(jantares));

        for(int i = 0; i < D; ++i){
            for(int j = 0; j < N; ++j){
                scanf("%d", &x);

                jantares[j] += x;
            }
        }

        resposta = 0;
        for(int i = 0; i < N; ++i){
            if(jantares[i] == D){
                resposta = 1;
                break;
            }
        }

        printf("%s\n", resposta ? "yes" : "no");
    }

    return 0;
}

Last updated