Завдання ІІ етапу Всеукраїнської
учнівської олімпіади з інформатики.
12.12.2015 p.
Задача 1. Кубики (15 балів)
Василько допомагає молодшому брату прибирати іграшки.
Кубики вони складають у коробку з кришкою, що має висоту K сантиметрів, ширину L
сантиметрів і глибину M сантиметрів.
Скільки кубиків можна скласти у коробку, якщо всі кубики однакові і кожен має
довжину ребра X сантиметрів?
Розміри коробки задано цілими числами, кожне з яких не перевищує 1000, довжина
ребра кубика – ціле число, що не перевищує 100.
Вхідні
дані: ви вводите з клавіатури
числа K, L, M, X через пропуск.
Вихідні
дані: ви виводите на екран максимальну кількість кубиків,
які можна скласти у коробку.
Приклади
вхідних і вихідних даних
Вхід
|
Вихід
|
50 60 40 5
|
960
|
Як завжди, перша задача не є складною, але має ньюанс. Сторона коробки поже бути меншою за сторону кубика. результат = 0. Також потрібно передбачити те, що при діленні отримуємо не цілі числа, а дробові і результат може бути неправильний.
При обчисленні кількості кубиків націло ділимо кожну сторону коробки на величину ребра кубика і перемножуємо між собою. Таким чином ми передбачили випадок коли сторона коробки менша за ребро кубика.
Такий вигляд має програма.
program zadacha1;
var n,K,L,M,X:integer;
begin
writeln ('Введіть висоту, ширину,глибину коробки і довжину ребра');
readln(k,l,m,x); //вводимо вхідні дані
n:=(K div x ) * ( M div x) * (L div x);
writeln(n);
end.
Для тестування програми надані такі вхідні значення.
Приклади
вхідних і вихідних даних
Вхід
|
Вихід
|
Рекомендована
кількість балів
|
50
60 40 5
|
960
|
2
|
405 715 519 20
|
17500
|
4
|
111 40 500 10
|
2200
|
4
|
49 500 790 50
|
0
|
4
|
1000 999 998 1
|
997002000
|
1
|
Задача 2. Вигідний проїзд (20 балів)
Нещодавно Іванко почав використовувати міські автобуси
для переїзду з дому у школу. Відомо, що квиток на один проїзд в автобусі коштує
a гривень.
А ще, Іванко дізнався, що можна купувати абонемент на m проїздів за b гривень (абонемент
можна купувати декілька разів). Іванко підрахував, що найближчим часом йому
доведеться n разів скористатися
міським автобусом.
Допоможіть Іванкові, порахуйте, яку мінімальну суму
грошей йому доведеться витратити, щоб здійснити n поїздок.
Вхідні дані: ви вводите з клавіатури
числа n, m, a, b (1 ≤ n, m, a, b ≤
1000) через пропуск.
Вихідні дані: ви
виводите на екран одне ціле число — мінімальну суму грошей, яку Іванкові
доведеться витратити.
Приклади
вхідних і вихідних даних
Вхід
|
Вихід
|
6 2 1 2
|
6
|
5 2 2 3
|
8
|
Шляхом потужних логічних міркувань придумуємо три варіанти розвитку подій.
1 Іванко не купує абонемент
2 Іванко купує абонемент, або кілька.
3 Іванко купує абонементів на один більше і частина проїздів "пропадає"
Залишається обчислити і порівняти що вигідніше.
program zadacha2;
var k,s,s1,n,m,a,b:integer;
begin
writeln ('введіть n m a b ' );
readln (n,m,a,b);
k:=n div m; //кількість абонементів
if b/m<a then //чи вигідно купувати абонемент
begin
s:=k*b+(n-k*m)*a; //частину поїздок їдемо за абонементом, а частину так
s1:=(k+1)*b; // рахуємо гроші якщо купити на один абонемент більше
if s1<s then s:=s1; // порівнюємо що вигідніше
end
else //якщо абонемент не вигідно купувати то рахуємо так
s:=n*a;//множимо кількість проїздів на ціну квитка
writeln(s);
end.
Приклади
вхідних і вихідних даних
Вхід
|
Вихід
|
Рекомендована
кількість балів
|
6
2 1 2
|
6
|
2
|
8 4 2 10
|
16
|
4
|
10 5 5 12
|
24
|
4
|
7 3 10 20
|
50
|
4
|
145 30 25 500
|
2500
|
6
|
Програма проста і зрозуміла так як я не вдавався до складних математичних обчислень не виводив остаточну велику і заплутану формулу. Свої варіанти розв'язку і запитання до даної програми пишіть у коментарях.
Задача 3. Секретний шифр (25 балів)
Коли Василь пише важливий лист, він його
шифрує. Не дуже надійним методом, але достатнім для того, щоб жоден
сторонній не зрозумів ані слова.
У шифрі кожне слово шифрується
окремо. Розглянемо шифрування на прикладі слів, що складаються лише з
малих латинських літер.
На початку кожна буква замінюється
відповідним їй числом: a на 0, b на 1, c на
2, ..., z на 25. Після цього до першого числа додається
5, до другого числа додається перше число, до третього - друге і
т.д. Після цього, якщо якесь число перевищує 25, то воно замінюється
залишком від ділення цього числа на 26. І, нарешті, числа у зворотному
порядку замінюються буквами.
Зашифруємо
слово secret:
Крок
0. secret
Крок 1. 18 4
2 17 4 19
Крок 2. 23
27 29 46 50 69
Крок 3. 23 1
3 20 24 17
Крок
4. xbduyr
У підсумку вийшло
слово xbduyr.
Вхідні дані. У єдиному рядку вхідного файлу 3.in міститься слово, яке складається з малих латинських літер, довжиною
не більше 100 символів.
Вихідні дані.
У вихідний файлі 3.out потрібно
записати зашифроване слово
Приклад вхідних і вихідних даних:
3.in
|
3.out
|
secret
|
xbduyr
|
Умова задачі містить в собі кроки які потрібно виконати. Це спрощує нам роботу.
program zadacha3;
const al='abcdefghijklmnopqrstuvwxyz';
var s:string;
i,j: integer;
m: array [0..100] of integer;
begin
//крок 0
writeln('введіть слово');
readln(s);
//крок 1
for i:=1 to length (s) do
begin //замінюємо букви на цифри
for j:=1 to 26 do
begin //записуємо цифри у масив
if s[i]=al[j] then m[i-1]:=j-1;
end;
end;
//крок 2
m[0]:=m[0]+5;// робимо перетворення згідно з умовою задачі
for i:=1 to length (s) do
m[i]:=m[i]+m[i-1];
//крок 3
for i:=0 to length (s)-1 do//продовжуємо перетворення
if m[i]>25 then m[i]:=m[i] mod 26;
//крок 4
for i:=1 to length (s) do
for j:=1 to 26 do //перетворюємо цифри назад в букви
if m[i-1]=j-1 then write (al[j]);
end.
Самостійно: Вхідні і вихідні дані помістити у файли.
program zadacha3;
const al='abcdefghijklmnopqrstuvwxyz';
var s:string;
i,j: integer;
m: array [0..100] of integer;
begin
//крок 0
writeln('введіть слово');
readln(s);
//крок 1
for i:=1 to length (s) do
begin //замінюємо букви на цифри
for j:=1 to 26 do
begin //записуємо цифри у масив
if s[i]=al[j] then m[i-1]:=j-1;
end;
end;
//крок 2
m[0]:=m[0]+5;// робимо перетворення згідно з умовою задачі
for i:=1 to length (s) do
m[i]:=m[i]+m[i-1];
//крок 3
for i:=0 to length (s)-1 do//продовжуємо перетворення
if m[i]>25 then m[i]:=m[i] mod 26;
//крок 4
for i:=1 to length (s) do
for j:=1 to 26 do //перетворюємо цифри назад в букви
if m[i-1]=j-1 then write (al[j]);
end.
Самостійно: Вхідні і вихідні дані помістити у файли.
Приклад вхідних і вихідних даних:
3.in
|
3.out
|
secret
|
xbduyr
|
abcde
|
fgilp
|
supercalifragilisticexpialidocious
|
xrgkbddowbssygrzrksuyvkssdlocemaum
|
z
|
e
|
zzzzzzzzzz
|
edcbazyxwv
|
Задача 4. Лічилка
(40 балів)
У колі стоять N учнів (мал.). Вони пронумеровані від 1 до
N. По черзі з кола починає виходити кожен третій учень. Це продовжується до тих
пір, поки в колі не залишиться останній учень. Визначити його номер.
Наприклад, якщо в колі стояло 7 учнів, то його по черзі
покинуть 3, 6, 2, 7, 5, 1. Залишиться учень, який спочатку стояв на 4
позиції.
Вхідні дані. У
вхідному файлі 4.in міститься одне натуральне число N — кількість учнів (6<N<1000).
Вихідні дані. У
вихідний файлі 4.out потрібно записати одне натуральне число — номером учня який залишився
Приклад вхідних і вихідних даних:
4.in
|
4.out
|
7
|
4
|
Примітка.
Робота з вхідними та вихідними даними без використання файлів (в
завданнях 3, 4) оцінюється з коефіцієнтом 0,8.
При розв'язувані складних задач потрібно роділити їх на декілька простіших і розв'язати кожну з них окремо.
Розв'язування четвертої задачі я розділив на такі три етапи:
1 - ввід даних і опрацювання вхідних даних
2 - обстеження отриманого масиву
3 - вивід результату
Під час оптимізації програми ви зможете об'єднати всі етапи в один, але це вже вимагає часу і майстерності.
При розв'язувані складних задач потрібно роділити їх на декілька простіших і розв'язати кожну з них окремо.
Розв'язування четвертої задачі я розділив на такі три етапи:
1 - ввід даних і опрацювання вхідних даних
2 - обстеження отриманого масиву
3 - вивід результату
Під час оптимізації програми ви зможете об'єднати всі етапи в один, але це вже вимагає часу і майстерності.
program zadacha4;
var i,N,m,l,lic:integer;
a:array [1..1000]of integer;
a:array [1..1000]of integer;
begin
writeln ('Введіть кількість учнів');
writeln ('Введіть кількість учнів');
readln(N);
for i:=1 to n do
begin a[i]:=i; // заповнюємо масив цифрами
end;
repeat
begin
for i:=1 to n do
begin
if a[i]<>0 then inc(lic); //обстежуємо елементи масиву.
// якщо елемент <>0 то збільшуємо лічильник
if lic=3 then
begin // якщо лічильник =3 то записуємо 0 в комірку масиву
a[i]:=0;//кожного третього перетворюємо в нуль
lic:=0;//лічильний в початкове значення
begin // якщо лічильник =3 то записуємо 0 в комірку масиву
a[i]:=0;//кожного третього перетворюємо в нуль
lic:=0;//лічильний в початкове значення
end;
end;
end;
// другий етап - підрахунок нулів в масиві
l:=0; //лічильник нулів
for i:=1 to n do
begin
if a[i]=0 then inc(l);
end;
until l=N-1; //зупиняємо всю програму коли лічильник нулів = N-1
// значить залишився тільки один останній елемент
// третій етап - вивід результату на екран
for i:=1 to n do // шукаємо у масиві ненульовий елемент і виводимо на екран.
begin
if a[i]<>0 then writeln (a[i]);
end;
end.
Самостійно: допишіть програму, щоб вона читала вхідні дані з файлу і результат виводила в інший файл. А також спробуйте об'єднати два останні етапи в одному циклічному операторі.
Для тестування програми використовуйте таку таблицю вхідних і вихідних даних.
Приклад вхідних і вихідних даних:
4.in
|
4.out
|
Рекомендована кількість балів
|
7
|
4
|
2
|
13
|
13
|
10
|
15
|
5
|
9
|
33
|
7
|
9
|
999
|
601
|
10
|
Немає коментарів:
Дописати коментар