Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Olimpiada.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
175.62 Кб
Скачать
  1. Петро, Василь та Микола

Три грибники, Петро, Василь та Микола, повертаючись з лісу додому, вирішили влаштувати привал, а заодно і перекусити. Як це у нас прийнято, через певний час кожен почав вихвалятись своїми сьогоднішніми успіхами, а з часом і ділитись знайденими грибами зі своїми товаришами. Перед привалом у кожного з них була певна цілочислова кількість грибів. Спочатку Петро дав Василю та Миколі по стільки грибів, скільки у них вже було. Микола швидко зрозумів, що так буде не по-братськи, і дав Василю та Петру по стільки грибів, скільки у них стало. Василь не міг відстати від співтоваришів і також дав кожному з друзів по стільки грибів, скільки у них на цей моменту було у наявності. І тут друзі з подивом виявили, що у всіх стало грибів порівну. Скільки грибів було у кожного перед привалом, якщо відомо, що всі разом вони зібрали N грибів?

Введення-виведення.

У єдиному рядку знаходиться єдине натуральне число N (N ≤ 30000).

У єдиному рядку вивести через пропуск кількість грибів перед привалом у Петра, Василя та Миколи відповідно.

Приклад.

Введення: 120

Виведення: 65 20 35

var

n,P,V,M:Integer;

begin

Readln(n);

P:=13*n div 24;

V:= 4*n div 24;

M:=7*n div 24;

Writeln(P,' ', V,' ',M,' ');

end.

8. НСД і НСК

Дано два цілі числа. Знайдіть їх найбільший спільний дільник та найменше спільне кратне.

Введення-виведення.

Ввести два цілі числа. Вивести через пробіл НСД та НСК.

Приклад.

Введення: 4, 6

Виведення: НСД=2 НСК=12.

Розв’язок

var a,b,k,nsd,nsk:real;

begin

read(a,b);

k:=a*b;

while a<>b do

if a>b then a:=a-b

else b:=b-a;

nsd:=a;

nsk:=k/nsd;

writeln('НСД=',nsd,' ','НСК=',nsk);

end.

9. Ділення на 3

Як відомо, число ділиться на 3 (без остачі) тоді і тільки тоді, коли сума його цифр ділиться на 3 також без остачі. Перевірьте цю ознаку подільності на 3 на прикладі заданого трицифрового числа.

Приклад 1. Приклад 2.

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

Виведення: ділиться Виведення: не ділиться.

Розв’язок

var a,b,c,k:longint;

begin

read(a,b,c);

k:=a+b+c;

if (k mod 3=0) then writeln('дiлиться')

else writeln('не дiлиться');

end.

Завдання 3. Гуси та кролі

У гусей та кролів разом n лап (n – парне). Скільки може бути гусей та кролів (вивести всі можливі поєднання)?

Введення: 10

Виведення: гусей 1 кролів 2

Гусей 3 кролів 1

Розв’язок

var n,a,a1,a2,b,b1:integer;

begin

read(n);

a:=n mod 4;

a1:=a div 2;

a2:=n div 4;

b:=n-4;

b1:=b div 2;

writeln('гусей ',a1,' ','кролiв ',a2);

writeln('гусей ',b1,' ','кролiв 1');

end.

10. Годинник

Ім'я вхідного файлу:

clock.dat

Ім'я вихідного файлу:

clock.sol

Максимальний час роботи на одному тесті:

1 секунда

Максимальна оцінка за завдання:

20 балів

Старовинний годинник б'є щопівгодини. Причому на початку кожної години він б'є стільки раз, скільки годин (по 1 разу – в час ночі і в час дня, по 2 рази – в дві години ночі та в дві години дня і так далі, опівночі і опівдні вони б'ють, відповідно, по 12 разів). І ще 1 раз вони б'ють в середині кожної години.

Даний проміжок часу (відомо, що пройшло строго менше 24 годин). Напишіть програму, що визначає, скільки ударів зробив годинник за цей час.

Формат вхідних даних

У першому рядку записаний початковий момент часу, в другому рядку — кінцевий. Моменти часу задаються двома цілими числами, що розділяються пропуском. Перше число задає години (від 0 до 23), друге - хвилини (від 1 до 59, при цьому воно не дорівнює 30).

Формат вихідних даних

У вихідний файл виведіть одне число — скільки ударів зробив годинник за цей відрізок часу.

Приклади

clock.dat

clock.sol

5 20

10 25

45

10 25

5 20

135

5 2

5 21

0

Розв’язок перший: моделювання. “Крутитимемо” стрілки годинника, кожну хвилину оцінюючи ситуацію і рахуючи удари. Цей алгоритм можна реалізувати, наприклад, так.

while (h1 <> h2) or (m1 <> m2) do begin

inc(m1); {додаємо одну хвилину}

if m1 = 60 then begin

inc(h1); h1 := h1 mod 24; m1 := 0;

if h1 mod 12 = 0 then

inc(res, 12)

else

inc(res, h1 mod 12);

end

else

if m1 = 30 then

inc(a);

end;

(тут h1:m1 – початковий час, h2:m2 – кінцевий час, res – кількість ударів).

Розв’язок другий: підрахунок ударів. Хай початковий час менше кінцевого. Тоді можна підрахувати кількість ударів таким чином. Загальна кількість ударів складається з

  • “годинних” ударів в моменти часу (h1+1):00, (h1+2):00, ., h2:00;

  • “півгодинних” ударів в моменти часу (h1+1):30, (h1+2):30, ., h2:30;

  • “півгодинного” удару у момент часу h1:30, якщо m1<30;

  • “півгодинного” удару у момент часу h2:30, якщо m2>30.

Тепер відмітимо, що за добу годинник б'є 180 разів. Тому у разі, коли кінцевий час менше початкового, можна поміняти їх місцями, обчислити кількість ударів за приведеною вище схемою і відняти отримане число з 180.

Розв’язок третый: явна формула. Позначимо через U(t1,t2) кількість ударів в проміжок часу [t1,t2]. Тоді

Для величини U(t,0) теж можна вивести явну формулу. Наприклад, таку:

U(h:m,0)= (h DIV 12) * 78 + {Кількість “годинних” ударів

за повних 12 годин }

+ (h MOD 12) * ((h MOD 12) + 1) DIV 2

{кількість “годинних” ударів

за останній час }

+ h {кількість “півгодинних” ударів}

+ ord (m > 30) {ще один “півгодинний” удар

якщо m>30 }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]