Задача A. Покер
Ім’я вхідного
файлу: іnput.txt
Ім’я вхідного
файлу: output.txt
Ліміт часу: 1с.
Задано 5 цілих
чисел. Серед них:
·
якщо однакові 5, то вивести "Impossible",
інакше
·
якщо однакові 4, то вивести "Four of a Kind",
інакше
·
якщо однакові 3 и 2, то вивести "Full House",
інакше
·
якщо є 5 послідовних, то вивести "Straight",
інакше
·
якщо однакові 3, то вивести "Three of a Kind",
інакше
·
якщо однакові 2 і 2, то вивести "Two Pairs",
інакше
·
якщо однакові 2, то вивести "One Pair", інакше
·
вивести "Nothing".
Вхідні дані
У першому рядку задано 5 чисел (від 1 до 13 включно)
через пропуск.
Вихідні дані
Виводиться один рядок - результат аналізу.
Приклади
іnput.txt
|
output.txt
|
1 3 9 3 2 |
One Pair |
1 5 5 4 4 |
Two Pairs |
10 11 12 13 1 |
Nothing |
Ідея:
Підготувати дані для
аналізу (створивши спеціальний масив) та обчислити кількості повторень чисел в
послідовності та послідовно перевірити всі умови, які наведені в задачі.
Для аналізу даних створити масив, який зберігатиме
не самі числа, а кількість їх повторень у заданій послідовності (нижче наведено
вигляд масиву, для першого прикладу):
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
1
|
1
|
2
|
1
|
Використати 5
лічильників, щоб порахувати, скільки разів зустрічаються в масиві числа
1,2,3,4,5.
Відповідно до умови
задачі перевірити кожну умову та вивести відповідь. Перевіряти потрібно в тому
ж порядку, як це описано в умові: якщо певна умова виконується, то наступні не будуть
виконуватись (оскільки вони суперечать попереднім умовам) і їх можна не
перевіряти.
Особливою перевіркою
є випадок 5 одиниць: якщо вони йдуть одна за одною без пропусків, то це «Straight», інакше «Nothing». Тому під час обчислення
кількості «1» можна запам’ятати, наприклад, позицію останньої (nomLastOne ) знайденої «1». А під час
перевірки умови для «Straight»,
порахувати кількість «1», що йдуть підряд без пропусків.
Для прискорення
роботи програми цикл, якщо знайдена відповідь – зупиняється командою break або
переходить до пошуку наступної відповіді за допомогою команди continue,
пропускаючи умови, які точно не виконуються на поточному кроці циклу.
#include <stdio.h>
#include <vector>
using namespace std;
vector<int> v(14, 0);
//----------------------------------------
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int x;
for(int i=0; i<5; ++i){
scanf("%d", &x);
v[x]++;
}
int k1=0, k2=0, k3=0, k4=0, k5=0;
int nomLastOne;
for(int i=0; i<14; ++i){
if(v[i]==5) { k5++; break; }
if(v[i]==4) { k4++; break; }
if(v[i]==3) { k3++; continue; }
if(v[i]==2) { k2++; continue; }
if(v[i]==1) {k1++; nomLastOne=i;}
}
if(k5==1) { printf("Impossible\n"); return 0; }
if(k4==1) { printf("Four of a
Kind\n"); return 0; }
if(k3==1 && k2==1) { printf("Full House\n"); return 0; }
if(k1==5) {
int i=nomLastOne;
while(i>=0 && v[i]==1) --i;
++i;
if(nomLastOne-i+1==5){
printf("Straight\n");
return 0;
}
}
if(k3==1) { printf("Three of a
Kind\n"); return 0; }
if(k2==2) { printf("Two Pairs\n"); return 0; }
if(k2==1) { printf("One Pair\n"); return 0; }
printf("Nothing\n");
return 0;
}
Немає коментарів:
Дописати коментар