Матч 313, Циклы в перестановке (CyclesInPermutations)

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

 

Игра в перестановки производится на доске размером 1 ´ n. В ячейках записаны числа от 1 до n, каждое по одному разу. Номер позиции первой ячейки равен 1, нумерация ячеек производится слева направо. Например, одна из допустимых позиций для доски размером 6 имеет вид:

3

2

4

1

6

5

Игра ведется следующим образом. Вначале игрок выбирает произвольную клетку в качестве начальной и становится на нее. На каждом шаге он передвигается в такую позицию, номер которой записан в текущей клетке. Процесс передвижения игрока продолжается до тех пор, пока он снова не окажется в начальной клетке.

Необходимо найти номер такой начальной клетки, для которой в процессе игры будут посещено максимально возможное количество клеток.

 

Класс: CyclesInPermutations

Метод: int maxCycle(vector<int> board)

Ограничения: board содержит от 1 до 50 разных чисел, пронумерованных с 1 до размера board.

 

Вход. Массив чисел board, содержащих перестановку чисел от 1 до n.

 

Выход. Максимальное количество клеток, которое игрок может посетить в процессе игры при оптимальном выборе начальной клетки.

 

Пример входа

board

{3,2,4,1,6,5}

{1,2,3,4,5,6}

{5,1,2,3,4}

 

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

3

1

5

 

 

 

РЕШЕНИЕ

комбинаторика

 

В задаче необходимо найти все длины циклов заданной перестановки и выбрать среди них наибольшую.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

using namespace std;

 

class CyclesInPermutations

{

public:

  int maxCycle(vector<int> board)

  {

    int i, j, count, res = 0;

    for(i = 0; i < board.size(); i++)

    {

      count = 0;

      for(j = board[i]; j - 1 != i; j = board[j - 1]) count++;

      if (count > res) res = count;

    }

    return res + 1;

  }

};