Plataforma: URI
Problema: 1136
Enunciado:
Albert, Charles e Mary inventaram uma nova versão do clássico jogo de Bingo. Na versão tradicional, o jogo é presidido por um não-jogador conhecido como caller. No começo de cada partida, cada jogador recebe uma carta contendo uma única combinação de números de 0 até N dispostos em colunas e linhas. O caller opera um globo contendo N+1 bolas numeradas de 0 até N. Em cada turno, o caller sorteia uma bola do globo, anuncia o número sorteado aos jogadores e não a coloca novamente no globo. Cada jogador procura pelo número em sua carta e o marca caso o encontre. O primeiro jogador que marcar um padrão pré-definido completo em sua carta (uma linha horizontal, por exemplo) ganha um prêmio.
Na versão Albert-Charles-Mary, em cada turno, o caller sorteia uma primeira bola, coloca-a de volta no globo, sorteia uma segunda bola, coloca-a de volta no globo, e então anuncia a diferença absoluta entre os números das duas bolas. Para aumentar o entusiasmo, antes do início da partida, um subconjunto possivelmente vazio de bolas é retirado do globo, de forma que ao menos duas bolas permaneçam no globo. Eles gostariam de saber se cada número de 0 até N podem ainda ser anunciados utilizando a nova regra de sorteio e considerando apenas as bolas que permaneceram dentro do globo.
Linguagem: C++
Solução:
#include <iostream> #include <set> #include <vector> using namespace std; int main() { int n, b, v; set<int> diferencas; vector<int> valores; while (cin >> n >> b) { if (!n && !b) break; for (int i = 0; i < b; i++) { cin >> v; valores.push_back(v); } for (int i = 0; i < b; i++) { for (int j = i; j < b; j++) { v = valores.at(i) - valores.at(j); v = (v < 0? -v : v); diferencas.insert(v); } } if (n + 1 != diferencas.size()) cout << "N" << endl; else cout << "Y" << endl; valores.clear(); diferencas.clear(); } return 0; }