Задачі районної олімпіади з інформатики.
Ця задача була, напевне, дана щоб ніхто не повернувся додому з нулем балів.
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.
Для розв’язання даної задачі потрібно розглянути такі випадки:
Іванко взагалі не купує абонемент. Іванко купує абонемент на менше поїздок ніж потрібно. Іванко купує абонемент на більше поїздок ніж потрібно. Тепер потрібно все порахувати і вибрати що найвигідніше.
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.
Для розв’язання цієї задачі просто потрібно виконати кроки задані в умові задачі.
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);
Ідея розв’язання. Спочатку коло "розгортаємо" в масив, тобто заповнюємо одномірний масив за правилом - перший елемент має значення 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.
Задача 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
|
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.
Немає коментарів:
Дописати коментар