Матч 337, Карточный стрит (CardStraights)

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

 

У игрока имеется набор карт. Каждая карта имеет номер от 1 до 1000000. Набор карт с последовательными номерами образуют стрит. Среди карт есть джокеры, которые могут принимать любой номер. Джокеры имеют номер 0. В задаче необходимо определить длину наибольшего стрита, который можно выложить из карт игрока.

 

Класс: CardStraights

Метод: int longestStraight(vector<int> cards)

Ограничения: cards содержит от 1 до 50 элементов, 0 £ cards[i] £ 1000000.

 

Вход. Массив целых чисел cards – значения карт игрока. Джокеры имеют номер 0.

 

Выход. Длина наибольшего стрита, который можно выложить из карт игрока.

 

Пример входа

cards

{0,6,5,10,3,0,11}

{100,100,100,101,100,99,97,103}

{0,0,0,1,2,6,8,1000}

 

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

5

3

6

 

РЕШЕНИЕ

обработка массивов

 

Прочитаем во множество c значение всех карт (кроме джокеров). Таким образом избавимся от повторений значений карт. В переменной joker найдем количество джокеров. Скопируем из множества c все значения карт в исходный вектор cards.

Очевидно, что все джокеры, которые есть у игрока, следует использовать. Если вектор cards пустой, то ответом будет joker. Иначе стараемся построить самый длинный стрит начиная с i - ой карты, 0 £ i < cards.size(). Среди всех полученных стритов находим наибольший.

 

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <set>

using namespace std;

 

class CardStraights

{

public:

  int longestStraight(vector<int> cards)

  {

    set<int> c;

    set<int>::iterator iter;

    int joker, i, j, k, s, max;

    for(max = joker = i = 0; i < cards.size(); i++)

      if (!cards[i]) joker++;else c.insert(cards[i]);

    for(cards.clear(), iter = c.begin(); iter != c.end(); iter++)

      cards.push_back(*iter);

    if (cards.empty()) max = joker;

    cards.push_back(2000001);

    for(i = 0; i < cards.size() - 1; i++)

    {

      j = s = joker; s++;

      for(k = i; ; k++)

      {

        j -= cards[k+1] - cards[k] - 1;

        if (j < 0) break;

        s ++;

      }

      if (s > max) max = s;

    }

    return max;

  }

};