програмування 2015

Задачі районної олімпіади з інформатики.

Задача 1. Кубики (15 балів)
Василько допомагає молодшому брату прибирати іграшки. Кубики вони складають у коробку з кришкою, що має висоту K сантиметрів, ширину L сантиметрів і глибину M сантиметрів. Скільки кубиків можна скласти у коробку, якщо всі кубики однакові і кожен має довжину ребра X сантиметрів? Розміри коробки задано цілими числами, кожне з яких не перевищує 1000, довжина ребра кубика – ціле число, що не перевищує 100.
Вхідні дані: ви вводите з клавіатури числа K, L, M, X через пропуск.
Вихідні дані:  ви виводите на екран максимальну кількість кубиків, які можна скласти у коробку.
Приклади вхідних і вихідних даних

Вхід
Вихід
Рекомендована кількість балів
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
Ця задача була, напевне, дана щоб ніхто не повернувся додому з нулем балів.

program kubik;
var
  k, l, m, x: integer;
begin
  writeln('Введіть розміри');
  readln(k, l, m, x);
  writeln((k div x) * (l div x) * (m div x));
end.

Задача 2. Вигідний проїзд (20 балів)
Нещодавно Іванко почав використовувати міські автобуси для переїзду з дому у школу. Відомо, що квиток на один проїзд в автобусі коштує a гривень. А ще, Іванко дізнався, що можна купувати абонемент на m проїздів за b гривень (абонемент можна купувати декілька разів). Іванко підрахував, що найближчим часом йому доведеться n разів скористатися міським автобусом.
Допоможіть Іванкові, порахуйте, яку мінімальну суму грошей йому доведеться витратити, щоб здійснити n поїздок.
Вхідні дані: ви вводите з клавіатури числа n, m, a, b (1 ≤ n, m, a, b ≤ 1000) через пропуск.
Вихідні дані: ви виводите на екран одне ціле число — мінімальну суму грошей, яку Іванкові доведеться витратити.

Для розв’язання даної задачі потрібно розглянути такі випадки:
Іванко взагалі не купує абонемент. Іванко купує абонемент  на менше поїздок ніж потрібно. Іванко купує абонемент на більше поїздок ніж потрібно. Тепер потрібно все порахувати і вибрати що найвигідніше.

Приклади вхідних і вихідних даних
Вхід
Вихід
Рекомендована кількість балів
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
 program proizd;
var
  a, n, m, b, sum, sum1, kilab: integer;
begin
  writeln('Ввести n,m,a,b');
  readln(n, m, a, b);
  kilab := n div m;
  if b / m < a then      //чи вигідно купувати абонемент
  begin
    sum := kilab * b + (n - kilab * m) * a;    //з абонементом і без
    sum1 := (kilab + 1) * b;         // якщо купити на один абонемент більше
    if sum1 < sum then sum := sum1;       // порівнюємо що вигідніше
  end
  else
    sum := n * a;          //сума без абонемента.
  writeln(sum);
end.

 Задача 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
abcde
fgilp

supercalifragilisticexpialidocious

xrgkbddowbssygrzrksuyvkssdlocemaum
z
e
zzzzzzzzzz
edcbazyxwv

 Для розв’язання цієї задачі просто потрібно виконати кроки задані в умові задачі.

 program fff;
var s,r:string;
    b:array[1..100] of integer;
    i,k:integer;
begin
k:=1;
s:='abcdefghijklmnopqrstuvwxyz';
writeln('Введіть слово');
readln(r);
for i:=1 to length(r) do
b[i]:=pos(copy(r,i,1),s)-1;      //замінюємо букви на відповідні числа
b[1]:=b[1]+5;                     

for i:=2 to length(r) do        //проводимо наступні дії з числами
  b[i]:=b[i]+b[i-1];
 
for i:=1 to length(r) do
  if b[i]>25 then b[i]:=b[i] mod 26;

for i:=1 to length(r) do    //замінюємо числа на букви
 begin
 k:=b[i]+1;
 r[i]:=s[k];
 end;
writeln(r);


Задача 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
2
13
13
10
15
5
9
33
7
9
999
601
10

Ідея розв’язання. Спочатку коло "розгортаємо" в масив, тобто заповнюємо одномірний масив за правилом - перший елемент має значення 1, другий 2 і т. д.  Потім потрібно виходити з кола, тобто замінювати кожний третій елемент масиву нулем. Зрозуміло, що потрібно виконати N-1 замін. В результаті в масиві повинен залишитись один елемент відмінний від нуля. Його потрібно відшукати і вивести в якості відповіді.

 program ssn;
var
n,i,j,z,k:integer;
mas:array[1..1000] of integer;
begin
writeln('введіть число n ');
read(n);

for i:=1 to n do   {заповнюємо масив}
mas[i]:=i;
i:=0;                 { змінна і буде відповідати за поточний елемент масиву}
for z:=1 to n-1 do    { змінна z відповідає за кількість замін}
   begin
    j:=1;               {починаємо шукати кожен третій елемент}
      while j<=3 do     {шукаємо кожен третій елемент}
      begin
          i:=i+1;       {перебираємо елементи}
           if i>n then i:=1;   {якщо дійшли до кінця, починаєм спочатку}
          if mas[i]<>0 then j:=j+1;  {рахуємо ненульові елементи в кожній трійці}
      end;
   mas[i]:=0;                        {замінюємо кожен третій елемент нулем}
   end;
    writeln;
for i:= 1 to n do if mas[i]<>0 then writeln(mas[i]); {виводимо відповідь}
end.

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

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