Algorithm
Problem Name: 2 AD-HOC - beecrowd | 2298
Problem Link: https://www.beecrowd.com.br/judge/en/problems/view/2298
Mini-Poker
Por OBI - Olimpíada Brasileira de Informática 2005 Brazil
Timelimit: 1
Mini-Poker é o nome de um jogo de cartas que é uma simplificação de Poker, um dos mais famosos jogos de cartas do mundo. Mini-Poker é jogado com um baralho normal de 52 cartas, com quatro naipes (copas, paus, espadas e ouro), cada naipe compreendendo treze cartas (Ás, 2, 3, 4, 5, 6, 7, 8, 9, 10, Valete, Dama, Rei).
No início do jogo, cada jogador recebe cinco cartas. O conjunto de cinco cartas vale um certo número de pontos, de acordo com as regras descritas abaixo. Diferentemente do jogo de Poker normal, em Mini-Poker o naipe das cartas é desconsiderado. Assim, para simplificar a descrição do jogo, vamos utilizar os números de 1 a 13 para identificar as cartas do baralho, na ordem dada acima. Uma outra diferença é que pode ocorrer empate entre mais de um vencedor; nesse caso os vencedores dividem o prêmio.
As regras para pontuação em Mini-Poker são as seguintes:
- Se as cinco cartas estão em seqüência a partir da carta x (ou seja, os valores das cartas são x, x+1, x+2, x+3 e x+4), a pontuação é x+200 pontos. Por exemplo, se as cartas recebidas são 10, 9, 8, 11 e 12, a pontuação é 208 pontos.
- Se há quatro cartas iguais x (uma quadra, ou seja, os valores das cartas são x, x, x, x e y), a pontuação é x+180 pontos. Por exemplo, se as cartas recebidas são 1, 1, 1, 10 e 1, a pontuação é 181 pontos.
- Se há três cartas iguais x e duas outras cartas iguais y (uma trinca e um par, ou seja, os valores das cartas são x, x, x, y e y), a pontuação é x + 160 pontos. Por exemplo, se as cartas recebidas são 10, 4, 4, 10 e 4, a pontuação é 164 pontos.
- Se há três cartas iguais x e duas outras cartas diferentes y e z (uma trinca, ou seja, os valores das cartas são x, x, x, y e z), a pontuação é x + 140 pontos. Por exemplo, se as cartas recebidas são 2, 3, 2, 2 e 13, a pontuação é 142 pontos.
- Se há duas cartas iguais x, duas outras cartas iguais y (x != y) e uma outra carta distinta z (dois pares, ou seja, os valores das cartas são x, x, y, y e z), a pontuação é 3 × x + 2 × y + 20 pontos, em que x > y. Por exemplo, se as cartas recebidas são 12, 7, 12, 8 e 7, a pontuação é 70 pontos.
- Se há apenas duas cartas iguais x e as outras são todas distintas (um par, ou seja, os valores das cartas são x, x, y, z e t), a pontuação é x pontos. Por exemplo, se as cartas recebidas são 12, 13, 5, 8 e 13, a pontuação é 13 pontos.
- Se todas as cartas são distintas, não há pontuação.
Escreva um programa que, fornecidas as cartas dadas a um jogador, calcule pontuação do jogador naquela jogada.
Entrada
A entrada é composta por vários casos de teste, cada um correspondendo a uma jogada. A primeira linha da entrada contém um inteiro N que indica o número de casos de teste (1 ≤ N ≤ 100). Cada uma das N linhas seguintes contém cinco números inteiros C1,C2,C3,C4 e C5, representando as cinco cartas recebidas por um jogador (1 ≤ C1,C2,C3,C4,C5 ≤ 13).
A entrada deve ser lida do dispositivo de entrada padrão (normalmente o teclado)
Saída
Para cada caso de teste da entrada, seu programa deve produzir três linhas na saída. A primeira linha deve conter um identificador do caso de teste, no formato “Teste n”, onde n é numerado seqüencialmente a partir de 1. A segunda linha deve conter a pontuação do jogador considerando as cinco cartas recebidas. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.
A saída deve ser escrita no dispositivo de saída padrão (normalmente a tela).
Exemplo de Entrada | Exemplo de Saída |
2 12 3 10 3 12 1 2 3 5 4 |
Teste 1 62 Teste 2 201 |
Code Examples
#1 Code Example with C++ Programming
Code -
C++ Programming
#include <algorithm>
#include <cstdio>
#include <vector>
#define PB push_back
using namespace std;
int main() {
int t;
scanf("%d", &t);
for (int caso = 1; caso < = t; caso++) {
int pontuacao = 0;
vector<int> cartas;
for (int i = 0; i < = 14; i++) cartas.PB(0);
for (int i = 0; i < 5; i++) {
int davez;
scanf("%d", &davez);
cartas[davez]++;
}
for (int i = 1; i < = 13; i++)
if (cartas[i] == 2) pontuacao = max(i, pontuacao);
for (int i = 1; i < = 13; i++) {
if (cartas[i] != 2) continue;
for (int j = i + 1; j < = 13; j++) {
if (cartas[j] != 2) continue;
for (int k = 1; k < = 13; k++) {
if (cartas[k] != 1) continue;
pontuacao = max(pontuacao, 3 * j + 2 * i + 20);
}
}
}
for (int i = 1; i < = 13; i++)
if (cartas[i] == 3) pontuacao = max(pontuacao, 140 + i);
for (int i = 1; i < = 13; i++) {
if (cartas[i] != 3) continue;
for (int j = 1; j < = 13; j++) {
if (cartas[j] != 2) continue;
pontuacao = max(pontuacao, 160 + i);
}
}
for (int i = 1; i < = 13; i++)
if (cartas[i] == 4) pontuacao = max(pontuacao, 180 + i);
for (int i = 1; i < = 9; i++) {
if (cartas[i] == 1 && cartas[i + 1] == 1 && cartas[i + 2] == 1 &&
cartas[i + 3] == 1 && cartas[i + 4] == 1)
pontuacao = max(pontuacao, 200 + i);
}
printf("Teste %d\n%d\n\n", caso, pontuacao);
}
return 0;
}
Copy The Code &
Try With Live Editor
Input
12 3 10 3 12
1 2 3 5 4
Output
62
Teste 2
201