Матч 22, Парковка машин (CarParking)

 

В городе улицы пронумерованы от 1 до streets. Вы находитесь на улице с номером now. Вы хотите припарковаться на ближайшей улице, номер которой является палиндромом. Если таких улиц несколько, то вернуть номер наименьшей.

 

Класс: CarParking

Метод: int closestShed(int now, int streets)

Ограничения: 1 £ streets £ 2147483647, 1 £ now £ streets.

 

Вход. Номер улицы now, на которой Вы находитесь и количество улиц в городе streets.

 

Выход. Номер ближайшей улицы, являющийся палиндромом.

 

Пример входа

now

streets

19

22

19

21

1234567

12345678

 

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

22

11

1234321

 

 

РЕШЕНИЕ

элементарные вычисления

 

Функция IsPal(i) проверяет, является ли число i палиндромом. Для этого запоминаем его в дополнительной переменной ii, ищем обращение i в переменной j, и сравниваем ii с j. Если числа равны, исходное i является палиндромом. Во избежание переполнения следует работать с 64 битовым целым типом.

Номера улиц могут быть 9 значные, следовательно до ближайшего палиндрома от любого числа будет не более 105 чисел. Перебираем числа nowi  и now + i (i = 0, 1, 2, 3, …),  проверяя, являются ли они палиндромами. Каждый раз следует проверять, не больше ли now + i числа улиц в городе. В цикле for сначала проверяем на палиндром число nowi, а потом now + i. Этим самым мы обеспечим тот факт, что если существует несколько улиц - палиндромов на одинаковом расстоянии от now, то первым будет найден меньший номер.

 

ПРОГРАММА

 

#include <stdio.h>

 

int IsPal(long long i)

{

  long long ii = i, j;

  for(j = 0; i > 0; i /= 10) j = 10 * j + i % 10;

  return (ii == j);

}

 

class CarParking

{

public:

  int closestShed(int now, int streets)

  {

    for(int i = 0; ; i++)

    {

      if (IsPal(now - i)) return now - i;

      if ((now + i <= streets) && (IsPal(now + i))) return now + i;

    }

  } 

};