середа, 25 лютого 2015 р.

Clock

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=104)

Задача. Стрілки годинника рухаються з постійним кутовими швидкостями   h  годин  m  хвилин. Найти  число повних хвилин до найближчого моменту, в  яких стрілки  співвпадуть.

Технічні умови. Програма читає два цілих числа  h  та  m  з клавіатури. Програма виводить.  ціле число  хвилин  на екран.

Приклади.

Введення: 0 0
Виведення: 0

Введення: 1 1
Виведення: 4
Розв'язання*.
Для розв'язування задачі скористаємося годинником ОС. Будемо по черзі від 0:00 до 12:00 співставляти стрілки годинника і записувати час. Отримаємо 11 співпадань, які розділять 12 годин на 12 проміжків. Так як нам потрібно знайти число повних хвилин, а також для зручності, переведемо ввведений час та часи співпадань у хвилини. Хвилини співпадань будемо зберігати в масиві, в який для замкнення кільця додамо 13-й елемент - 720 хвилин = 0:00. Отже, якщо введений час потраплятиме в один із проміжків, то різниця між кінцем інтервалу і введеним часом буде шуканою, інакше стрілки вже співпадають.
Запишемо алгоритми мовами програмування.

Free Pascal:
Const X : Array [0..11] Of 0..720 =
(0, 65, 130, 196, 261, 327, 392, 458, 523, 589, 654, 720); 
Var H, M, I : Integer;
Begin
 Read (H, M);
 M := (H mod 12)*60 + M;
 H := 0;
 For I := 1 To 11 Do
  If (X[I-1] < M) And (M < X[I])
    Then H := X[I] - M;
 Write (H);   
End.

C++:
#include <iostream>
using namespace std;
int main()
{
 const int x[] =
 {0, 65, 130, 196, 261, 327, 392, 458, 523, 589, 654, 720};
 int h, m;
 cin >> h >> m;
 m=(h%12)*60+m, h=0;
 for (int i=1; i<=11; i++)
  if ((x[i-1]<m)&&(m<x[i]))
   h=x[i]-m;
 cout << h;
}

* Розв'язання, хоча воно вірне, не дуже мені подобається...

1 коментар: