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;
}#include <iostream>
#include <vector>
using namespace std;
int main(){
    int N, D, x;
    bool resposta;
    vector<int> jantares;
    while(cin >> N >> D){
        if(!N && !D)    break;
        resposta = false;
        jantares.assign(N, 0);
        for(int i = 0; i < D; ++i){
            for(int j = 0; j < N; ++j){
                cin >> x;
                jantares[j] += x;
            }
        }
        for(int i = 0; i < N; ++i){
            if(jantares[i] == D){
                resposta = true;
                break;
            }
        }
        cout << (string) (resposta ? "yes" : "no") << endl;
    }
    return 0;
}var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var lines = input.trim().split('\n');
lines.pop();
while(lines.length){
    let [N, D] = lines.shift().trim().split(' ').map((x) => parseInt(x));
    let jantares = Array(N);
    jantares.fill(0);
    for(let i = 0; i < D; ++i){
        let participantes = lines.shift().trim().split(' ').map((x) => parseInt(x));
        
        for(let j = 0; j < N; ++j){
            jantares[j] += participantes[j];
        }
    }
    let resposta = jantares.some((x) => x === D);
    console.log(resposta ? 'yes' : 'no');
}while True:
    try:
        N, D = [int(x) for x in input().strip().split(' ')]
        if(not N and not D):
            break
        jantares = [0 for _ in range(N)]
        for i in range(D):
            participantes = [int(x) for x in input().strip().split(' ')]
            for j in range(N):
                jantares[j] += participantes[j]
        
        resposta = False
        for i in range(N):
            if(jantares[i] == D):
                resposta = True
                break
        
        print('yes' if resposta else 'no')
    except EOFError:
        breakLast updated
Was this helpful?