Матч 387, Угадывание следующего элемента (GuessingNextElement)

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

 

Арифметическая прогрессия определяется первым членом a1 и разностью d:

a1, a1 + d, a1 + 2d, a1 + 3d, …

Геометрическая прогрессия определяется первым членом b1 и знаменателем q:

b1, b1q, b1q2, b1q3, …

Массив a содержит или арифметическую или геометрическую прогрессию. Известно, что по содержимому массива a однозначно определяется тип прогрессии. Необходимо найти следующий элемент последовательности.

 

Класс: GuessingNextElement

Метод: int guess(vector<int> a)

Ограничения: a содержит от 3 до 50 элементов в возрастающем порядке, 1 £ a[i] £ 106.

 

Вход. Массив a содержит последовательность целых чисел.

 

Выход. Следующий элемент последовательности.

 

Пример входа

a

{364,843,1322,1801}

{394,1172,1950,2728,3506,4284,5062,5840}

{13,117,1053,9477,85293}

 

 

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

2280

6618

767637

 

 

РЕШЕНИЕ

математика

 

По трем первым элементам последовательности можно установить, является ли она арифметической или геометрической прогрессией и соответственно найти разность d = a[1] – a[0] или знаменатель q = a[1] / a[0]. Поскольку массив а содержит только целые числа, то q будет целочисленным. Входная последовательность является арифметической прогрессией, если 2 * a[1] = a[0] + a[2] и геометрической иначе. Для нахождения следующего элемента следует к последнему элементу прибавить d в случае арифметической прогрессии или умножить последний элемент на q в случае геометрической прогрессии.

 

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

using namespace std;

 

class GuessingNextElement

{

public:

  int guess(vector<int> a)

  {

    int res,d;

    if (2*a[1] == a[0] + a[2])

    {

      d = a[1] - a[0];

      res = a[a.size()-1] + d;

    } else

    {

      d = a[1] / a[0];

      res = a[a.size()-1] * d;

    }

    return res;

  }

};