Матч 322, Образующая последовательность (DerivativeSequence)

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

 

В массиве a задана последовательность, состоящая из k элементов. По ней можно найти последовательность, состоящую из разностей соседних элементов. Например, из последовательности {5, 6, 3, 9, -1} можно получить {6-5, 3-6, 9-3, -1-9} = {1, -3, 6, -10}. Формально, последовательностью разностей для {a1, a2, …, ak} будет {b1, b2, …, bk-1}, где bi = ai+1ai.

Разностью n - го порядка для последовательности a будет такая последовательность, которая будет получена применением выше описанного правила n раз. Например, для вычисления разности второго порядка для {5, 6, 3, 9, -1} следует произвести преобразования:

{5, 6, 3, 9,-1} -> {1, -3, 6,-10} -> {-3-1, 6-(-3), -10-6} = {-4, 9, -16}

По заданной последовательности a требуется найти ее n - ую разность.

 

Класс: DerivativeSequence

Метод: vector<int> derSeq(vector<int> a, int n)

Ограничения: a содержит от 1 до 20 элементов, -100 £ a[i] £ 100, 0 £ n £ k -1.

 

Вход. Массив чисел a и величина искомой разности n.

 

Выход. n - ая разность последовательности a.

 

Пример входа

a

n

{5,6,3,9,-1}

1

{5,6,3,9,-1}

2

{5,6,3,9,-1}

4

{4,4,4,4,4,4,4,4}

3

 

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

{1,-3, 6, -10}

{-4, 9, -16}

{-38}

{0, 0, 0, 0, 0}

 

 

 

РЕШЕНИЕ

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

 

Задача решается моделированием процесса вычисления разностей. Выполняем n итераций. На каждой итерации вычисляем разности и удаляем последний элемент массива.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

using namespace std;

 

class DerivativeSequence

{

public:

  vector<int> derSeq(vector<int> a, int n)

  {

    while(n--)

    {

      for(int i = 0; i < a.size() - 1; i++) a[i] = a[i+1] - a[i];

      a.erase(a.end() - 1);

    }

    return a;

  }

};