Олімпіада з програмування 2015

Завдання ІІ етапу Всеукраїнської учнівської олімпіади з інформатики.  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.
Самостійно: Вхідні і вихідні дані помістити у файли.
  
Приклад вхідних і вихідних даних:
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 - вивід результату

Під час оптимізації програми ви зможете об'єднати всі етапи в один, але це вже вимагає часу і майстерності. 

program zadacha4;

var i,N,m,l,lic:integer;
a:array [1..1000]of integer;

begin
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;//лічильний в початкове значення 
        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

Немає коментарів:

Дописати коментар