11388. Игра в карточки 2

 

Хусейн разложил в ряд n карточек с числами a1, a2, a3, ..., an. Затем он собрал их и разложил в другом порядке: a1, a3, a5, ..., a6, a4, a2. Именно эту последовательность он и передал Ярославу. Помогите Ярославу восстановить исходную последовательность Хусейна.

Например, если Ярослав получил последовательность (2, 4, 9, 4, 7, 6), то Хусейну он должен вернуть последовательность (2, 6, 4, 7, 9, 4).

 

Вход. Первая строка содержит число n (1 ≤ n ≤ 10000) – количество карточек. Вторая строка содержит n натуральных чисел, записанных на карточках. Все числа не превышают 109.

 

Выход. Выведите исходную последовательность Хусейна.

 

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

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

6

2 4 9 4 7 6

2 6 4 7 9 4

 

 

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

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

7

5 7 34 1 89 4 2

5 2 7 4 34 89 1

 

 

РЕШЕНИЕ

два указателя

 

Анализ алгоритма

Пусть массив a содержит числа, записанные на карточках. Инициализируем два указателя: i = 0 на начало массива и j = n – 1 на его конец. 

Для восстановления исходной последовательности следует попеременно брать карточки то слева, то справа, пока не будут обработаны все элементы. При каждом выборе соответствующий указатель сдвигается: i – вправо, j – влево.

 

Пример

Рассмотрим несколько шагов работы алгоритма для первого теста.

 

Реализация алгоритма

Объявим рабочий массив.

 

int a[100001];

 

Читаем входные данные.

 

scanf("%d", &n);

for (i = 0; i < n; i++)

  scanf("%d", &a[i]);

 

Установим указатели i = 0 и j = n – 1.

 

i = 0; j = n - 1;

 

Пока выполняется неравенство ij, попеременно выводим то a[i] то a[j], одновременно передвигая указатели.

 

while (i <= j)

{

  printf("%d ", a[i++]);

  if (i > j) break;

  printf("%d ", a[j--]);

}