Матч 257, Очки в бридже (BridgePts)

Дивизион 2, Уровень 2

 

Колода состоит из 52 карт, каждая из которых имеет масть (креста, бубна,       черва, пика) и значение (туз, 2, 3, …, 10, валет, дама, король). При игре в бридж игроку сдаются 13 карт, после чего происходит подсчет очков: за каждый туз дается 4 очка, за каждого короля – 3, за даму – 2, за вальта – 1 очко. Для каждой масти прибавляется 1 очко, если имеется в точности 2 карты этой масти, 2 очка если имеется ровно 1 карта масти, и 3 очка если карт этой масти не существует.

Необходимо по набору карт, содержащемуся в массиве hand, подсчитать количество очков. Карты крестовой масти нумеруются с 1 до 13, бубновой с 14 до 26, червовой с 27 до 39, пиковой с 40 до 52. Для каждой масти карты нумеруются в порядке туз, 2, 3, …, 10, валет, дама, король. Например, король червовый имеет номер 39, а туз пиковый имеет номер 40.

 

Класс: BridgePts

Метод: int pointValue(vector<int> hand)

Ограничения: hand содержит 13 разных чисел, 1 £ hand[i] £ 52.

 

Вход. Массив чисел hand, описывающий имеющиеся на руках 13 карт.

 

Выход. Количество очков в имеющихся 13 картах.

 

Пример входа

hand

{25,14,15,16,17,18,19,20,21,22,23,24,26}

{2,3,4,15,18,28,29,30,41,42,43,16,17}

 

Пример выхода

19

0

 

 

РЕШЕНИЕ

моделирование

 

В массиве suit вычисляем количество карт соответствующей масти (suit[0] соответствует числу карт крестовой масти), в массиве card подсчитываем количество карт определенного значения (card[0] соответствует количеству тузов, а  card[12] количеству королей). Далее подсчитываем количество очков по описанному в условии задачи алгоритму.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

using namespace std;

 

int suit[4], card[13];

 

class BridgePts

{

public:

  int pointValue(vector<int> hand)

  {

     int i, res;

     for(res = i = 0; i < hand.size(); i++)

       card[(hand[i] - 1) % 13]++, suit[(hand[i] - 1) / 13]++;

     res += 4 * card[0] + 3 * card[12] + 2 * card[11] + card[10];

     res = res + (suit[0] == 2) + (suit[1] == 2) + (suit[2] == 2) +

                 (suit[3] == 2);

     res = res + 2*(suit[0] == 1) + 2*(suit[1] == 1) + 2*(suit[2] == 1) +

                 2*(suit[3] == 1);

     res = res + 3*(suit[0] == 0) + 3*(suit[1] == 0) + 3*(suit[2] == 0) +

                 3*(suit[3] == 0);

     return res;

  }

};