Задача 6278 - простий математичний аналіз задачі і її умови

Надрукувати

www.e-olymp.com/uk/problems/6278

Номери будинків

Вивести 1, якщо будинки з номерами N і M знаходяться на одній стороні вулиці, і 0 у протилежному випадку.

Вхідні дані

Значення N і M (1N, M100).

Вихідні дані

Відповідь до задачі.

Вхідні дані

1 2

Вихідні дані
 
0

 


 

Розбираємося з вхідними даними. Як правило, номери будинків – цілі числа, але бувають номери 14/1, або 101 корпус 4, або, як у Булгакова в «Майстері і Маргариті» номер будинку, де відбувається частина роману має номер 302-біс.  Тому було б непогано, якщо б в умові задачі було написано, що m і n – цілі числа в певному діапазоні. Для python навіть неважливо, в якому діапазоні.  Але в умові, як на мене, не дуже зрозуміло. Значення N і M (1N, M100). А може бути 9Б або 9/1 або 52-11? Якщо може, то тут є певні питання. Ну а ми  для початку ПРИПУСКАЄМО, що n і m – цілі числа.

 

В даній задачі, на мій погляд, ввести дані оптимально у змінні за допомогою функції map(). Хто забув як це робити - довідник "input-print". Використання списку в даному випадку є, на мій погляд, недоцільним, цей спосіб неоптимальний ні по часу, ні по використанню пам’яті ні по зручності.

 

Тепер  давайте розберемося з умовою при цілих вхідних даних. Як правило, при нумерації будинків, по одній стороні вулиці будинки мають парні номери, наприклад 10, 22, 86. Аналогічно по іншій стороні вулиці будинки мають непарні номери.  Відповідно, якщо два номери будинки парні, то будинки знаходяться на одній стороні вулиці. Так само якщо два номери будинки непарні, то будинки знаходяться також на одній стороні вулиці.

 

Парність і непарність можна легко перевірити аналізом залишку від ділення на 2 - (n % 2). Якщо залишок нульовий, то число парне.

 

Відповідно, дуже просте рішення виглядає так:

 

якщо (n є парним і m є парним) або (n є непарним і m є непарним):

    виводимо «1», інакше виводимо «0».

 

на python це може бути, наприклад, так:

 

if (n % 2 == 0 and  m % 2 == 0) or (n % 2 != 0 and  m % 2 != 0):

    print (1)

else:

    print (0)

 

Але це достатньо громіздке рішення. Давайте пошукаємо більш елегантне. Якщо нечасто прогулювати математику, то можна згадати про суми парних і непарних. Давайте просумуємо n і m. Якщо вони обидва парні, то і сума буде парна. Наприклад 12+20=32. Якщо обидва непарні, то сума також буде парна. Наприклад 11+15=26. Отже, якщо обидва числа парні або обидва непарні, то сума буде парна. Переформулюємо для нашої задачі: Якщо сума (n+m) парна, то будинки з номерами n і m знаходяться  на одній стороні вулиці.  Якщо ж сума (n+m) буде непарною, то номери будинків будуть знаходитися на різних сторонах вулиці.

 

Ця задача - той випадок, коли нескладний математичний аналіз задачі дає просте і елегантне рішення.

 

На e-olymp ця задача здається без проблем, але якщо ви будете розв’язувати дану проблему в реальних умовах, вимагайте точного описання вхідних даних і правил нумерування. В Японії, наприклад, номера будинків не мають ніякого зв'язку з їх місцем розташування - нумерація проводиться в порядку забудови. Тому ров'язати цю задачу по номерам будинків в Японії неможливо. В реальності вимагайте точний опис завдання, бо інакше ваша программа може працювати невірно, а хто тоді будет дурнем? Точніше – кого тоді замовник зробить дурнем? Правильно! tongue-out