Програмування 2017

На даній сторінці будуть розгглянуті задачі районної олімпіади з інформатики у Косівському районі.


Завдання ІІ етапу Всеукраїнської учнівської олімпіади з інформатики. 9.12.2017 p.

8, 9 класи

Важливо!  Ввід вхідних даних здійснюється зі стандартного пристрою введення (клавіатура), вивід вихідних даних на стандартний пристрій виведення (екран). Дотримуйтеся формату вхідних і вихідних даних! Обмеження на час виконання кожної програми – до 1 секунди!
 


А. Монети (15 балів)

На столі розміщено n монет. Деякі з них лежать вверх решкою, а деякі – гербом. Визначте мінімальну кількість монет, які потрібно перевернути, щоб всі монети були повернуті вверх однією й тією ж стороною.








Вхідні дані

У першому рядку міститься натуральне число N (від 1 до 100) — кількість монет. У  другому рядку містяться N цілих чисел, розділених пропуском — 1 якщо монета лежить решкою вгору і 0 якщо вгору гербом.



Вихідні дані

Виведіть мінімальну кількість монет, які потрібно перевернути.

Приклади

Вхідні дані Вихідні дані
5
1 0 1 1 0
2
6
0 1 0 1 0 1
3


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

program zavd1;
var
  n, i, k0,k1: integer;
  mass: array[1..100] of integer;

begin
  readln(n);
  for i := 1 to n do
    read(mass[i]);

  for i := 1 to n do
    if mass[i] =0  then k0:=k0+1 else k1:=k1+1;
  if k0<k1 then writeln(k0) else writeln(k1);
 
end.



B. Без ліфта (20 балів)

Троє друзів – Андрій, Борис та Володя живуть відповідно на a, b та v поверхах багатоповерхового будинку. Вони займаються спортом, тому ніколи не користуються ліфтом. Одного разу їм потрібно було терміново зустрітися у когось з них вдома. Складіть програму, яка б визначала номер поверху, на якому вони мають зустрітися, щоб час збору був мінімальним. Врахуйте, що швидкість спуску по сходах у 47/31 рази більша за швидкість підйому.

Вхідні дані

В одному рядку містяться три натуральних числа, розділених пропуском – номери поверхів, на яких живуть друзі a,b,v (від 1 до 28 кожне)

Вихідні дані

Виведіть номер поверху, на якому друзі мають зустрітися.

Приклади

Вхідні дані Вихідні дані
11 4 5 5
17 17 17 17


Для розв’язування даної задачі потрібно знайти час, який потрібен для збору на різних поверхах і вибрати з них найменший.

program ddd;
var n1,n2,n3,i,tpid:integer;
t1,t2,t,tmin,t11,t12,t13:real;
begin
writeln('Введіть номери поверхів');
readln(n1,n2,n3);
tpid:=10;
if n2>=n1 then t1:=(n2-n1)*tpid else t1:=(n1-n2)*tpid*47/31;      {визначаємо час, який            витратимо,   щоб зібратись на}
if n3>=n1 then t2:=(n3-n1)*tpid else t2:=(n1-n3)*tpid*47/31;    {поверсі, номер якого записаний  першим}
if t1>=t2 then t11:=t1 else t11:=t2;                              {у змінній t11 запамятовуємо цей час}
                          
if n3>=n2 then t1:=(n3-n2)*tpid else t1:=(n2-n3)*tpid*47/31;    {визначаємо час, який витратимо, щоб зібратись на}
if n2>=n1 then t2:=(n2-n1)*tpid*47/31 else t2:=(n1-n2)*tpid;    {поверсі, номер якого записаний другим}
if t1>=t2 then t12:=t1  else t12:=t2;                           {у змінній t12 запамятовуємо цей час}

if n3<=n2 then t1:=(n2-n3)*tpid else t1:=(n3-n2)*tpid*47/31;    {аналогічно}
if n3>=n1 then t2:=(n3-n1)*tpid*47/31 else t2:=(n1-n3)*tpid;
if t1>=t2 then t13:=t1 else t13:=t2 ;
tmin:=t11;i:=n1;                                                  {визначаємо який час мінімальний }
if t12<tmin then begin i:=n2;tmin:=t12;end;                       {і виводимо відповідний поверх}
if t13<tmin then begin i:=n3;tmin:=t13;end;

writeln(i);
end.

C. Свято рівності (30 балів)

В деякій фейковій країні Новомокша проживає n громадян, добробут кожного оцінюється цілим числом в ai бурлів (бурль — грошова одиниця Новомокші).

В честь Свята Рівності король Новомокші вирішив зробити подарунок своєму народу: вирівняти статки усіх громадян, виплативши кожному певну суму бурлів (забирати кошти ні в кого не будуть).

Ви — королівський казначей, якому потрібно порахувати мінімальні витрати королівства на подарунок короля.

Вхідні дані

У першому рядку міститься ціле число n (1≤n≤100) — кількість громадян королівства. У другому рядку міститься n цілих чисел, розділених пропуском — a1,a2,...,ai,…,an, де ai (0ai106) добробут і-го громадянина

Вихідні дані

Виведіть ціле число S — мінімальну кількість бурлів, які доведеться витратити.

Приклади

Вхідні дані Вихідні дані
5
3 4 2 0 1
10
5
1 1 0 1 1
1



D. Новорічна ялинка (35 балів)

Паралельні ряди іграшок Новорічної ялинки умовно пронумеровані згори до низу, починаючи з нуля (в нульовому ряді, тобто на вершині ялинки, розміщено іграшку у вигляді зірки з числом 1). Починаючи з першого ряду ялинки, на ній розміщують іграшки (у вигляді кульки) з числами в такому порядку: в кожному наступному ряді, іграшки розміщені ступінчасто й навскіс відносно іграшок у попередньому ряді. Кожне число на іграшці в кожному ряді одержуємо, додавши два числа, розміщені на іграшках вгорі (зліва і справа). Якщо зліва або справа немає іграшки, підставляємо нуль на її місце. Наприклад, перше число на іграшці в першому ряді 0 + 1 = 1, тоді як числа на іграшках 1 і 3 в третьому ряді утворюють на другій іграшці четвертого ряду число 4 (1 + 3 = 4).




Напишіть програму, яка виведе послідовність чисел, розміщених на кульках останнього нижнього ряду ялинки.

Вхідні дані

Програма читає натуральне число N (1≤N≤20) — номер останнього нижнього ряду ялинки.

Вихідні дані

В один рядок виведіть послідовність чисел, розділених пропуском, які розміщені на кульках N-го ряду ялинки, починаючи з крайньої лівої кульки.

Приклади

Вхідні дані Вихідні дані
4
1 4 6 4 1
5
1 5 10 10 5 1

Для розв’язування даної задачі використовуємо два масиви. Перший формуємо, виходячи з початкових даних. Другий формуємо з першого, додаючи сусідні елементи. Потім перезаписуємо перший елементами з другого. Повторюємо дані кроки відповідно до кількості рядів, які необхідно обчислити.
 
program ddd;
var
   a,b:array[0..32] of integer;
   i,j,n:integer;
begin
  writeln('Ввести номер ряду');
  readln(n);
  a[0]:=0;
  a[1]:=1;
  a[2]:=0;
  for i:=1 to n do
    begin
      for j:=1 to i+1 do
        b[j]:=a[j-1]+a[j];
      for j:=1 to i+1 do
        a[j]:=b[j];
        a[j+1]:=0;
    end;
  for i:=1 to n+1 do
    write(a[i],' ');
end.


10, 11 класи

Важливо!  Ввід вхідних даних здійснюється зі стандартного пристрою введення (клавіатура), вивід вихідних даних на стандартний пристрій виведення (екран). Дотримуйтеся формату вхідних і вихідних даних! Обмеження на час виконання кожної програми – до 1 секунди!


А. Свято рівності (15 балів)

В деякій фейковій країні Новомокша проживає n громадян, добробут кожного оцінюється цілим числом в ai бурлів (бурль — грошова одиниця Новомокші).

В честь Свята Рівності король Новомокші вирішив зробити подарунок своєму народу: вирівняти статки усіх громадян, виплативши кожному певну суму бурлів (забирати кошти ні в кого не будуть).

Ви — королівський казначей, якому потрібно порахувати мінімальні витрати королівства на подарунок короля.

Вхідні дані

У першому рядку міститься ціле число n (1≤n≤100) — кількість громадян королівства. У другому рядку міститься n цілих чисел, розділених пропуском — a1,a2,...,ai,…,an, де ai (0ai106) добробут і-го громадянина

Вихідні дані

Виведіть ціле число S — мінімальну кількість бурлів, які доведеться витратити.

Приклади

Вхідні дані Вихідні дані
5
3 4 2 0 1
10
5
1 1 0 1 1
1

Розв’язуючи дану задачу знайдемо максимальне значення добробуту. Для свята рівності необхідно додати кожному жителю кількість бурлів, якої йому не вистачає до максимальної. Сумуючи дані доплати, знаходимо відповідь на дану задачу.

program rivn;
var
  a: array[1..100] of integer;
  n, s, i, max: integer;

begin
  readln(n);
  for i := 1 to n do read(a[i]);
  max := a[1];
  for i := 1 to n do
    if a[i] > max then max := a[i];
  for i := 1 to n do s := s + (max - a[i]);
  writeln(s);
end.

В. Кубик (20 балів)

Куб з ребром N см пофарбували і розрізали на кубики з ребром 1 см. Отримані кубики будуть мати різну кількість зафарбованих граней.

Наприклад, якщо N=3, то після розрізання матимемо 8 кубиків, у яких зафарбовано три грані, 12 з двома гранями, 6 з однією, а один кубик буде зовсім не зафарбований. Написати програму, яка б визначала, скільки кубиків з кожною можливою кількістю зафарбованих граней отримано.

Вхідні дані

Програма читає натуральне число N (від 1 до 100000) — довжина ребра кубика

Вихідні дані

В окремих рядках виведіть пари чисел, розділені пропуском у порядку зростання першого числа: кількість зафарбованих граней, кількість отриманих кубиків.

Приклади

Вхідні дані Вихідні дані
3
0 1
1 6
2 12
3 8
5
0 27
1 54
2 36
3 8


program zavd2;
var n, zer, one, two, tre : integer;
begin
  readln(n);
  zer := (n-2)*(n-2)*(n-2);
  two := (n-2) * 4 * 3;
  tre := 8;
  one := n*n*n - (zer + two + tre);
  if n = 1 then
  begin
  zer := 0;
  one := 0;
  two := 0;
  tre := 0;
  end;
  writeln(0, ' ', zer);
  writeln(1, ' ', one);
  writeln(2, ' ', two);
  writeln(3, ' ', tre);
end.


C. IP-адреса (30 балів)

Основним параметром або ідентифікатором кожного комп'ютера в мережі є його IP-адреса, наприклад: 254.0.127.12. Кожен октет IP-адреси – це ціле число в діапазоні від 0 до 255 включно, однак перший октет не може бути числом 0. Дано число N – послідовність із k арабських цифр (4≤k≤12) без пропусків чи інших розділових знаків, наприклад: 254012712, причому, зліва нулі відсутні.

Написати програму, яка визначає кількість IP-адрес, котрі можливо сформувати, із заданої послідовності арабських цифр.

Вхідні дані

Програма читає натуральне число N (послідовність із k арабських цифр, 4≤k≤12).

Вихідні дані

Виведіть одне число – кількість IP-адрес (якщо ІР-адресу сформувати неможливо – виведіть 0)

Приклади

Вхідні дані Вихідні дані
6833989842
0
2341231672
2

program ip;
 
var
  s: string;
  i, j, k, l, n, a, b, c, d, code: integer;
 
begin
  readln(s);
  n := 0;
  for i := 1 to 3 do
    for j := 1 to 3 do
      for k := 1 to 3 do
        for l := 1 to 3 do
          if i + j + k + l = length(s) then
          begin
            val(copy(s, 1, i), a, code);
            val(copy(s, i + 1, j), b, code);
            val(copy(s, i + j + 1, k), c, code);
            val(copy(s, i + j + k + 1, l), d, code);
            if (a <= 255) and (b <= 255) and (c <= 255) and (d <= 255) then n := n + 1;
          end;
  writeln(n);
end.

D. Терези (35 балів)

Вимірювання ваги предмету здійснюється за допомогою лабораторних ваг. За допомогою набору із 7 гирь вагою 1 г, 3 г, 9 г, 27 г, 81 г, 243 г та 729 г можна виміряти вагу будь-якого предмету з цілою вагою від 1 до 1093 г єдиним способом. Наприклад, для вимірювання предмету вагою 4 г необхідно на одну шальку покласти гирі у 1 та 3 г, а на іншу сам предмет, а, скажімо, для предмета вагою 68 г на шальку з ним додаються гирі у 1, 3 та 9 г, а на іншу – гиря у 81 г.  Скласти програму, яка б визначала, скільки гирь з даного набору потрібно використати для зважування предмета заданої ваги.

Вхідні дані

Програма читає вагу предмету Х (натуральне число від 1 до 1000)

Вихідні дані

Виведіть ціле число – кількість потрібних для зважування даного предмету гирь

Приклади

Вхідні дані Вихідні дані
4
2
68
4


program zavd4;
var x, i, max, vaga, k, k1 : integer;
    mass:array[1..70] of integer;

begin
  readln(x);
  mass[1] := 1;
  for i := 2 to 7 do
    mass[i] := mass[i-1] * 3;
   
  for i := 1 to 7 do
  begin
    if (x > mass[i]) and (x < mass[i+1]) then  max := mass[i+1];            
  end;
  k := 1;
  vaga := max - x;
  for i := 7 downto 1 do
    if vaga div mass[i] <> 0 then begin k := k + 1; vaga := vaga mod mass[i]; end;
  if (x mod 10 = 2) then k1 := 1 else k1 := 0;
  if (x mod 10 = 5) then k1 := k1 + 1 else k1 := 0;
  for i := 7 downto 1 do
    if x div mass[i] <> 0 then begin k1 := k1 + 1; x := x mod mass[i]; end;
    if k < k1 then writeln(k) else writeln(k1);

end.

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

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