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

Олімпіадна задача на графи "Острови"
Кожен елемент квадратної матриці розміреності N x N дорівнює нулю, або одиниці. Знайдіть кількість «островів», утворених одиницями. Під «островом» розуміється група одиниць (або одна одиниця), з усіх боків оточена нулями (або краями матриці). Одиниці відносяться до одного «острову», якщо з однієї з них можна перейти до іншої «наступ» на одиниці, розташовані в сусідніх клітинах. Сусідніми є клітини, які межують по горизонталі або вертикалі.

Я дещо змінив вихідне умову задачі, уточнивши, що одна одиниця теж вважається островом. Також я пропоную зчитувати матрицю з файлу, на дворі адже вже 2010 рік і розв'язування олімпіадних завдань перевіряються, в основному, за допомогою тестуючих систем.

Вхідні дані

У першому рядку файлу INPUT.TXT записано натуральне число N не більш 100 - розмір квадратної матриці. У наступних N рядках задаються елементи матриці через пробіл.

Вихідні дані

У файл OUTPUT.TXT виведіть єдине число - кількість островів.

Приклад

INPUT.TXT OUTPUT.TXT
5
1 0 1 1 січня
0 0 0 0 0
1 січня 1 0 1
0 1 0 0 1
0 0 0 1 1 4


Рішення завдання

Отже, це класична задача на пошук в глибину графа. Зрозуміло, що треба обходити матрицю і якимось чином обчислювати кількість островів. Варіант вирішення такої: після того, як ми потрапляємо на острів, треба це зафіксувати збільшивши змінну-результат на одиницю. Щоб вдруге не порахувати один і той же острів, відразу після відвідин необхідно його знищити, тобто присвоїти всім клітинам острова значення нуль.

Оскільки тест завдання не надто малий, варто написати процедуру знищення островів, назвемо її "count". Щоб під час виконання процедуру не «вискочити" за межі масиву, зробимо його не розміром N x N, а розмірів N + 2 x N + 2, це дасть нам можливість оточити шуканий масив розміром N x N нулями.

const
  m = 102;
var
  a: array [1..m, 1..m] of integer;
  i, j, n, res: integer;
  input, output: text;
procedure count (i, j: integer);
  begin
    if a [i, j] <> 1 then
      exit;
    a [i, j]: = 0;
    count (i + 1, j);
    count (i - 1, j);
    count (i, j + 1);
    count (i, j - 1);
  end;
begin
  res: = 0;
  assign (input, 'input.txt');
  reset (input);
  assign (output, 'output.txt');
  rewrite (output);
  read (input, n);
  {Заповнюємо масив нулями}
  for i: = 1 to n + 2 do
    for j: = 1 to n + 2 do
      a [i, j]: = 0;
  {Прочитуємо матрицю з файлу}
  for i: = 2 to n + 1 do
    for j: = 2 to n + 1 do
      read (input, a [i, j]);
  {Обходимо матрицю в пошуку островів}
  for i: = 2 to n + 1 do
    for j: = 2 to n + 1 do
      if a [i, j] = 1 then
        begin
          inc (res);
          count (i, j);
        end;
  write (output, res);
  close (input);
  close (output);
end.


Лінійні програми.
Кубики. Кубик з ребром N см пофарбували і розрізали на кубики з ребром 1 см. При цьому з'явилися такі, у яких пофарбовано різну кількість граней. Наприклад, якщо N = 3, то після розрізання буде 8 кубиків, у яких пофарбовано три грані, 12 з двома гранями, 6 з одного, а один кубик буде зовсім незабарвлений. Складіть програму, яка б визначала, скільки кубиків з кожною можливою кількістю забарвлених граней.
Технічні умови
Ім'я програми
CUBES. *
Введення
З клавіатури вводиться ціле число N (від 1 до 1292)
Висновок
На екран або форму виводяться різні варіанти забарвлень і їх кількості в форматі: колічество_окрашених_граней / колічество_кубіков в порядку зростання першого параметра
Приклад
Введення
Висновок
1
3
0/1 1/6 2/12 3/8
Рішення мовою Паскаль:
program cubes;
uses crt;
var x, x1, x2, x3, x0, y, z, k, n: integer;
s: string; f, g: text;
begin
assign (f, 'cubes.dat');
reset (f);
readln (f, y);
close (f);
x3: = 8;
x1: = sqr (y-2) * 6;
x0: = (sqr (y-2)) * (y-2);
x2: = (y-2) * 4 * 2 + (y-2) * 4;
assign (g, 'cubes.sol');
rewrite (g);
writeln (g, '0 /', x0, '1 /', x1, '2 /', x2, '3 /', x3);
close (g);
end.


Галуження
Відрізок. Відрізок на площині задається двома неспівпадаючі кінцевими точками A (x1; y1) і B (x2; y2). З точки С (х3; у3) до прямої, що містить відрізок АВ, проводиться перпендикуляр р Визначити, потрапляє перпендикуляр на відрізок АВ або на його продовження.
У вхідному файлі міститься три пари чисел, що є координатами точок А, В, С. У файлі міститься відповідь «На відрізок» або «На продовження».
Приклад вхідного і вихідного файлів
Файл Z1.dat
Файл Z1.rez
3 березня
2 червня
4 серпня
На продовження
Рішення мовою Паскаль:
program z3;
var x1, x2, x3, y1, y2, y3, ac, ab, bc, a1, b1: real; f, f1: text;
begin
assign (f, 'z1.dat');
rewrite (f);
readln (x1, y1);
readln (x2, y2);
readln (x3, y3);
writeln (f, x1, y1);
writeln (f, x2, y2);
writeln (f, x3, y3);
close (f);
ac: = sqr (x1-x3) + sqr (y1-y3);
ab: = sqr (x2-x1) + sqr (y2-y1);
bc: = sqr (x3-x2) + sqr (y3-y2);
b1: = (ab + bc-ac) / (2 * sqrt (ab * bc));
a1: = (ac + ab-bc) / (2 * sqrt (ac * ab));
if (a1 <0 b1="" font="" or="" then="">
begin
assign (f1, 'z1.rez');
rewrite (f1);
writeln ('na prodolzenue');
writeln (f1, 'na prodolzenue'); close (f1)
end
else
begin
assign (f1, 'z1.rez');
rewrite (f1);
writeln ('na otrezke');
writeln (f1, 'na otrezke');
close (f1)
end
end.


Dlina. 
Дано ціле N> 2 і дійсні числа a1, b1, ... an, bn. (Ai, bi). Розглядаючи пари чисел ai і bi, як ліві і праві кінці відрізків на одній і тій же прямій, визначити кінці відрізка, що є перетином усіх цих відрізків. Якщо такого числа немає, то повідомити про це. У вхідному файлі в першому рядку задається число N, в наступних N рядках - координати кінців відрізків; у файлі виводяться координати кінців відрізка, що є перетином усіх цих відрізків, або повідомлення «Немає перетину».
Файл DLINA.DAT
Файл DLINA.SOL
3
1 лютому
4 березня
5 червня
Ні перетину
3
1 жовтня
3 липня
4 серпня
47
Рішення мовою Паскаль:
program Dlina;
var a, a1, a2, a3, b1, b2, b3, z, n, g, d: integer; f, f1: text; x: string;
begin
assign (f, 'dlina.dat');
writeln ('vvedite kolvo otrezkov'); readln (a);
writeln ('vvedite konci pervogo otrezka'); readln (a1, b1);
writeln ('vvedite konci vtorogo otrezka'); readln (a2, b2);
writeln ('vvedite konci tretego otrezka'); readln (a3, b3);
rewrite (f);
writeln (f, a);
writeln (f, a1, '', b1);
writeln (f, a2, '', b2);
writeln (f, a3, '', b3);
close (f);
assign (f1, 'dlina.sol');
rewrite (f1);
close (f1);
if a2> a3 then z: = a2 else z: = a3;
if a1> z then n: = a1 else n: = z;
writeln ('bolshee iz trex', n);
if b2
if b1> d then g: = b1 else g: = d;
writeln ('menshee iz trex', g);
x: = 'peresechenia net';
if n
begin
assign (f1, 'dlina.sol');
append (f1);
writeln (f1, n, g);
close (f1);
end
else
begin
assign (f1, 'dlina.sol');
append (f1);
writeln (f1, x);
close (f1);
end;
end.


Digit. 
У позитивному цілому числі викреслити цифру так, щоб число, яке залишилося, було найбільшим.
Вхідний файл Digit.dat
Вихідний файл Digit.sol
Приклад 1
Приклад 2
321
123
32
23
Рішення мовою Паскаль:
program z1;
var x, a, b, c, n: integer; f, f1: text;
begin
write ('vvedite chislo');
assign (f, 'Digit.dat');
rewrite (f);
readln (x);
writeln (f, x);
close (f);
a: = x div 100;
b: = x mod 100 div 10;
c: = x mod 10;
if (a b) and (b
assign (f1, 'Digit.sol');
rewrite (f1);
writeln ('N =', N);
writeln (f1, N);
close (f1)
end.


LESSON
У першому півріччі 2007-08 навчального року заняття проходять з 1 по 8 та з 10 по 17 тижні (дев'ятий тиждень - канікули). У розкладі одного з класів п'ять днів на тиждень (з понеділка по п'ятницю) відбувається по шість уроків щодня, всього 480 уроків за півріччя. Всі ці уроки пронумеровані. Складіть програму, що визначає, на якому тижні і який день тижня проходить урок з даним номером N.
Технічні умови
Ім'я програми
LESSON. *
З вхідного файлу зчитується ціле число - номер уроку N (від 1 до 480). У вихідний файл виводяться номер тижня і назва дня (українською, російською або англійською мовою)
Приклад
LESSON.DAT
LESSON.SOL
1
239
Week 8 Friday
2
242
Week 10 Monday
Рішення мовою Паскаль:
program LESSON;
var x, a, b: integer; c: string; f, f1: text;
begin
assign (f, 'LESSON.dat');
rewrite (f);
readln (x); writeln (f, x);
close (f);
a: = (x div 30) +1;
if (a> = 9) and (a <= 17) then a: = a + 1;
b: = x mod 30;
if (b> = 1) and (b <= 6) then c: = 'Monday' else begin
b: = b mod 6;
case b of
1: c: = 'Mondey';
2: c: = 'Tuesday';
3: c: = 'Wednesday';
4: c: = 'Trursday';
5: c: = 'Friday'
else c: = 'vixodni';
end;
end;
assign (f1, 'LESSON.sol');
rewrite (f1);
writeln (f1, 'week', a);
writeln (f1, c);
close (f1);
writeln ('a =', a, 'b =', b, 'c =', c);
end.
Другий варіант
program LESSON;
var f1, f2: text; i, k, j, l, m, n, a, b, c, d: integer;
begin
assign (f1, 'lesson.dat');
reset (f1);
assign (f2, 'lesson.sol');
rewrite (f2);
read (f1, n);
k: = n div 6 div 5;
l: = n - k * 30;
d: = l div 7 + 1;
if k = 8 then writeln (f2, 'week', 10) else writeln (f2, 'week', k + 1);
if d = 1 then writeln (f2, 'Monday');
if d = 2 then writeln (f2, 'Tuesday');
if d = 3 then writeln (f2, 'Wednesday');
if d = 4 then writeln (f2, 'Thursday');
if d = 5 then writeln (f2, 'Friday');
close (f1);
close (f2);
end.


Місця 
В плацкартному вагоні 54 місця, які розташовані в дев'яти купе. Місця від 1 до 36 основні і вони розташовані по чотири в купе (1 - 4 у першому, ..., 33 - 36 у дев'ятому), від 37 до 54 - бічні, розбиті по два, але розташування по купе зворотне: місця 37 , 38 знаходяться в дев'ятому купе, 39 і 40 у восьмому, ..., 53 і 54 у першому. За номером місця визначте номер купе.
Технічні умови
Ім'я програми
VAGON. *
Введення
З клавіатури вводиться ціле число - номер місця (від 1 до 54)
Висновок
На екран виводиться ціле число - номер купе
Приклад
Введення
Висновок
1
39
8
Рішення мовою Паскаль:
program vagon;
var t: text; s: string; n, r: integer;
begin
assign (t, 'vagon.dat');
reset (t);
read (t, s);
close (t);
assign (t, 'vagon.sol');
rewrite (t);
val (s, n, r);
if n <= 36 then
if n mod 4 = 0 then write (t, n div 4)
else write (t, n div 4 +1)
else
if n mod 2 = 1 then write (t, 9 - (n - 36) div 2)
else write (t, 10 - (n - 36) div 2);
close (t);
end.
Другий варіант
program vagon;
uses crt;
var x, y, z, k: integer; f, g: text;
begin
clrscr;
assign (f, 'vagon.dat');
reset (f);
readln (f, y);
close (f);
if (y> 0) and (y <= 54) then begin
if (y> 0) and (y <= 36) then x: = (y div 4) +1;
if (y> 36) and (y <= 54) then begin
if y mod 2 = 0 then x: = 10 - ((y-36) div 2) else x: = 9 - ((y-36) div 2) end;
end;
assign (g, 'vagon.sol');
rewrite (g);
writeln (g, x);
close (g);
end.
Ще один варіант
program vagon;
var f1, f2: text; n: integer;
begin
assign (f1, 'vagon.dat');
assign (f2, 'vagon.sol');
reset (f1);
rewrite (f2);
readln (f1, n);
case n of
1..4,53,54: writeln (f2, '1');
5..8,52,51: writeln (f2, '2');
9..12,50,49: writeln (f2, '3');
13..16,48,47: writeln (f2, '4');
17..20,46,45: writeln (f2, '5');
21..24,44,43: writeln (f2, '6');
25..28,42,41: writeln (f2, '7');
29..32,40,39: writeln (f2, '8');
33..36,38,37: writeln (f2, '9');
end;
close (f1);
close (f2);
end.


Кубики 
Кубик з ребром N см пофарбували і розрізали на кубики з ребром 1 см. При цьому з'явилися такі, у яких пофарбовано різну кількість граней. Наприклад, якщо N = 3, то після розрізання буде 8 кубиків, у яких пофарбовано три грані, 12 з двома гранями, 6 з одного, а один кубик буде зовсім незабарвлений. Складіть програму, яка б визначала, скільки кубиків з кожною можливою кількістю забарвлених граней.
Технічні умови
ім'я програми
CUBES. *
Введення
З клавіатури вводиться ціле число N (від 1 до 1292)
Висновок
На екран або форму виводяться різні варіанти забарвлень і їх кількості в форматі: колічество_окрашених_граней / колічество_кубіков в порядку зростання першого параметра
Приклад
Введення
Висновок
1
3
0/1 1/6 2/12 3/8
Рішення мовою Паскаль:
program cubes;
var n, a, b, c, d: integer; f: text;
begin
assign (f, 'cubes.dat');
reset (f);
read (f, n);
close (f);
assign (f, 'cubes.sol');
rewrite (f);
if n = 1 then write (f, '0/0 1/0 2/0 3/1');
if n = 2 then write (f, '0/0 1/0 2/0 3/8');
if n> 2 then begin
a: = 8;
b: = 12 * n-24;
c: = 6 * n * n-3 * a-2 * b;
d: = n * n * n-a-b-c;
write (f, '0 /', d, '', '1 /', c, '', '2 /', b, '', '3 /', a);
end;
close (f);
end.
Другий варіант
uses crt;
var n, i, j, k, m, k0, k1, k2, k3: longint; f, f1: text;
begin
clrscr;
assign (f, 'CUBES.dat');
reset (f);
assign (f1, 'CUBES.sol');
rewrite (f1);
readln (f, n);
k: = n * n * n;
if n = 1 then writeln (f1, '6/1') else
if n = 2 then writeln (f1, '3/8') else
begin
k2: = 12 * (n-2);
k3: = 8;
k1: = 6 * (n * n-4-4 * (n-2));
k0: = k-k1-k2-k3;
writeln (f1, '0 /', k0, '', '1 /', k1, '', '2 /', k2, '', '3 /', k3)
end;
close (f); close (f1);
end.
Ще один варіант
program cubes;
var x1, x2: integer; x3, x4, n: integer; f1, f2: text;
begin
assign (f1, 'cubes.dat');
assign (f2, 'cubes.sol');
reset (f1);
read (f1, n);
rewrite (f2);
if (n> = 1) and (n <= 1292)
then
begin
x4: = 8;
x3: = (n - 2) * 12;
x2: = ((n - 2) * (n - 2)) * 6;
x1: = (n - 2) * (n - 2) * (n - 2);
end;
if (n> 1)
then writeln (f2, '0 /', x1, '1 /', x2, '2 /', x3, '3 /', x4);
if (n = 1) then writeln (f2, '4/1');
close (f1);
close (f2);
end.
Цикли
Завдання 1 На інтервалі [m; n] знайти кількість натуральних чисел виду 3d5p (d, p - позитивні цілі числа).
Приклад вхідного і вихідного файлів
Файл Z1.dat
Файл Z1.rez
3000 3100
10
Рішення мовою Паскаль:
program z1;
var a1, b1, c1, d1, a2, b2, c2, d2, m, n, k, s, x, i: integer;
f, f1: text;
begin
assign (f, 'z1.dat');
rewrite (f);
readln (m, n);
writeln (f, m, n);
close (f);
a1: = m div 1000; b1: = m mod 1000 div 100;
c1: = m mod 100 div 10; d1: = m mod 10;
a2: = n div 1000; b2: = n mod 1000 div 100;
c2: = n mod 100 div 10; d2: = n mod 10;
for i: = 1 to 10 do
begin
if b1
begin

k: = k + 1;
b1: = b1 + 1;
end;
if d1
begin
x: = x + 1;
d1: = d1 + 1;
end;
end;
s: = 10 * k + x;
assign (f1, 'z1.rez');
rewrite (f1);
writeln ('s =', s);
writeln (f1, s);
close (f1)
end.
Завдання 2. Задана рядок, що складається з цифр і букв. Знайти суму чисел, записаних в рядку. У випадку, якщо рядок не містить жодної цифри, вивести повідомлення «Цифр немає».
Приклад вхідного і вихідного файлів
Файл Z1.dat
Файл Z1.rez
1авк25ннн
8
Рішення мовою Паскаль:
program z1;
var x, r: string; i, s, n, cod: integer; f, f1: text;
begin
assign (f, 'z1.dat');
rewrite (f);
readln (x);
writeln (f, x);
close (f);
for i: = 1 to length (x) do
begin
r: = x [i];
val (r, n, cod);
s: = s + n;
end;
if s = 0 then
begin
assign (f1, 'z1.rez');
rewrite (f1);
writeln ('cipher not');
writeln (f1, 'cipher not');
close (f1)
end;
if s> 0 then
begin
assign (f1, 'z1.rez');
rewrite (f1);
writeln ('s =', s);
writeln (f1, s);
close (f1)
end
end.
REBUS.Составіть програму REBUS, яка визначає всі 4-значні числа на інтервалі [M, N], що задовольняють умовам:
a) abcd - 4-цифрове число;
b) a, b, c, d - різні цифри;
c) ad - cd = a + b + c + d;
і підраховує загальну кількість цих чисел.
У вхідному файлі REBUS.DAT в 1-му та 2-му рядках знаходяться два числа M і N. У файлі REBUS.SOL виводяться числа, що задовольняють умовам а) -з), і їх кількість.
файл REBUS.DAT
файл REBUS.SOL
5128
5467
5139
5302
2
Рішення мовою Паскаль:
program REBUS;
var a, b, c, d, m, n, k, x, i: integer; f, f1, f2: text;
begin
assign (f, 'rebus.dat');
readln (m, n);
rewrite (f);
writeln (f, m);
writeln (f, n);
close (f);
for i: = m to n do
begin
a: = i div 1000; b: = i mod 1000 div 100;
c: = i mod 100 div 10; d: = i mod 10;
if (a <> b) and (a <> c) and (a <> d) and (b <> c) and (b <> d) and (c <> d) and (a * dc * d = a + b + c + d) then
begin k: = k + 1;
assign (f1, 'rebus.sol');
append (f1);
writeln (f1, i);
close (f1);
end;
end;
assign (f1, 'rebus.sol');
rewrite (f1);
writeln (k);
writeln (f1, k);
close (f1) end.
DATES. Дано дві календарні дати. Обчисліть кількість днів між ними.
Дані вводяться у файл у форматі «ДД.ММ.РРРР», де ДД - день, ММ - місяць, РРРР - рік.
Файл DATES.DAT
Файл DATES.SOL
21.01.1996
22.01.1996
1
01.02.1996
01.03.1996
29
Рішення мовою Паскаль:
program RUN;
Uses CRT;
Const M: array [0..11] of byte = (31,29,31,30,31,30,31,30,30,31,30,31);
var chiclo1, chiclo2, i, w1, w2, god1, god2, S, S1, S2: integer; f, f1: text;
begin
assign (f, 'dates.dat');
writeln ('vvedite pervy daty');
readln (chiclo1, w1, god1);
writeln ('vvedite vtorogy daty');
readln (chiclo2, w2, god2);
rewrite (f);
if (chiclo1 <10 0="" and="" chiclo1="" f="" font="" god1="" then="" w1="" writeln="">
if (chiclo2 <10 0="" and="" chiclo2="" f="" font="" god2="" then="" w2="" writeln="">
if (chiclo1> 10) and (w1 <10 0="" chiclo1="" f="" font="" god1="" then="" w1="" writeln="">
if (chiclo2> 10) and (w1 <10 0="" chiclo2="" f="" font="" god1="" then="" w1="" writeln="">
close (f);
assign (f1, 'd: \ dates.sol');
rewrite (f1);
close (f1);
S1: = 0; S2: = 0;
for i: = 0 to w1-2 do begin S1: = S1 + M [i];
writeln ('S1 =', S1);
end;
S1: = S1 + chiclo1; writeln ('S1 + dni =', S1);
for i: = 0 to w2-2 do begin S2: = S2 + M [i];
writeln ('S2 =', S2);
end;
S2: = S2 + chiclo2; writeln ('S2 + dni =', S2);
S: = S2-S1;
writeln ('raznica dney =', s);
assign (f1, 'dates.sol');
append (f1);
writeln (f1, s);
close (f1);
end.
DATES. Стрілки годинника рухаються з постійними кутовими швидкостями і показують h годин m хвилин. Знайти число повних хвилин до того часу, коли стрілки співпадуть.
Дані вводяться з файлу DATES.DAT у форматі "hm". У файл DATES.SOL виводиться кількість повних хвилин.
DATES.DAT
DATES. SOL
Приклад 1
Приклад 2
0 0
1 січня
0
5
Рішення мовою Паскаль:
program OLIMP;
var CHAS, MIN, i: integer; CHAS1, MIN1: real; f, f1: text;
begin
assign (f, 'DATES.DAT');
rewrite (f);
write ('vvedite vrema');
readln (CHAS, MIN);
writeln (f, CHAS: 3, MIN: 3);
close (f);
i: = 0;
CHAS1: = CHAS * 30;
MIN1: = MIN * 6;
while CHAS1> MIN1 do
begin
CHAS1: = CHAS1 + 0.5;
MIN1: = MIN1 + 6;
i: = i + 1;
end;
assign (f1, 'DATES.SOL');
rewrite (f1);
writeln ('proshlo', i, 'minyt');
writeln (f1, i);
close (f1)
end.
Lift. Щоб підняти на N-й поверх M-поверхового будинку новий холодильник, Вітя викликав бригаду вантажників. Оплата роботи вантажників розраховується так: за підйом холодильника на один поверх потрібно заплатити 200 гривень, за спуск на один поверх - 100 гривень. За підйом і спуск на ліфті плата не стягується. Незважаючи на те, що в будинку є ліфт, Віті можливо все ж доведеться заплатити вантажникам, оскільки ліфт зупиняється тільки на кожному K-му поверсі, починаючи з першого (тобто на поверхах з номерами 1, K +1, 2K +1, 3K +1, ...). Потрібно вирахувати, який мінімальної суми грошей достатньо, щоб вантажники доставили холодильник з першого поверху на N-й.
У вхідному файлі записані три числа: M (2 <= M <= 100), N (2 <= N <= M) і K (2 <= K <= M-1), розділені пробілами.
У вихідний файл виведіть одне число - мінімальну вартість підйому холодильника.
Файл Lift.dat
Файл Lift.sol
Приклад 1
20 4 липня
200
Приклад 2
20 2 липня
0
Рішення мовою Паскаль:
program Lift;
var A, B, N, K, M, c, i: integer; W: array [1..20] of integer; f, f1: text;
begin
assign (f, 'Lift.dat');
rewrite (f);
write ('vvedite kol-vo etazhey M ='); readln (M);
write ('vvedite etazh dostavki N ='); readln (N);
write ('vvedite shag ostanovki lifta K ='); readln (K);
writeln (f, M: 3, N: 3, K: 3);
close (f);
i: = 1;
repeat
W [i]: = (i-1) * k + 1; c: = i;
i: = i + 1;
until W [i-1]> M; {C - chetchik ostanovok);}
For i: = 1 to c do begin
if (W [i]
begin A: = (N-W [i]) * 200;
B: = (W [i + 1] -N) * 100;
if A> B then begin
assign (f1, 'Lift.sol');
rewrite (f1);
writeln ('opyckaemca B =', B);
writeln (f1, B);
close (f1)
end
else begin
assign (f1, 'Lift.sol');
rewrite (f1);
writeln ('podnimaemca A =', A);
writeln (f1, A);
close (f1)
end;
end;
if W [i] = N then begin
assign (f1, 'Lift.sol');
rewrite (f1);
writeln ('nichego ne platim');
writeln (f1, 'nichego ne platim');
close (f1)
end;
end;
end.
«Нещасливі пікові» числа. Тризначне число назвемо «піковим», якщо його цифра десятків буде більше цифри одиниць і сотень (напр., Число 276 - «пікове», а 954 і 277 - ні). Складіть програму, яка підраховує, скільки «пікових» чисел знаходиться на відрізку [A, B] і скільки з них діляться без залишку на 13.
Технічні умови
Ім'я програми
PICK. *
Введення
два цілих числа 100 <= Aі <= Bі <= 999
Висновок
У текстовий файл PICK.SOL виводиться кількість «пікових» чисел і тих з них, які діляться без залишку на 13
Приклад
PICK.DAT
PICK.SOL
пояснення
1
135145
1 квітня
У першому тесті на проміжку 135-145 перебуває 4 пікових числа: 140, 141, 142, 143 і 143 ділиться без залишку на 13, у другому тесті числа 120 і 121 на 13 не діляться
Рішення мовою Паскаль:
program PICK;
var x, a, b, n, k, m, c, t: integer; f, f1: text;
begin
write ('vvedite 2 chisla cheres probel');
assign (f, 'PICK.DAT');
rewrite (f);
readln (A, B); writeln (f, A, '', B);
close (f);
for x: = a to B do
begin
n: = x Div 100;
k: = x mod 100 div 10;
m: = x mod 10;
if (K> n) and (k> m) then c: = c + 1;
if x mod 13 = 0 then t: = t + 1;
end;
assign (f1, 'PICK.SOL');
rewrite (f1);
writeln (f1, c, '', t);
close (f1);
writeln ('a =', a, 'b =', b, 'c =', c, 't =', t);
end.
Другий варіант
Program PICK;
var f1, f2: text; a, b, c, d, i, j, k, l, n, x, y, z: integer;
begin
assign (f1, 'pick.dat');
reset (f1);
assign (f2, 'pick.sol');
rewrite (f2);
readln (f1, l);
for d: = 1 to l do begin
read (f1, a, b);
k: = 0;
J: = 0;
for i: = a to b do begin
z: = i mod 10;
y: = i div 10 mod 10;
x: = i div 100;
if (y> x) and (y> z) then k: = k + 1;
if (y> x) and (y> z) and (i mod 13 = 0)
then j: = j + 1;
end;
write (f2, k, '', j);
end;
close (f1);
close (f2);
end.
Додавання. Число, яке однаково читається зліва направо і навпаки, називається паліндромом, напр., 3773. Візьмемо довільне число N (від 10 до 10000). Якщо воно не паліндром, додамо до нього число, що складається з тих самих цифр, але записаних у зворотному порядку. Будемо повторювати цю операцію, поки не отримаємо паліндром (якщо це можливо). Наприклад, N = 49, 49 +94 = 143, 143 +341 = 484. Напишіть програму, яка б визначала, можна із заданого числа N отримати паліндром, і якщо можливо, то за яку мінімальну кількість додавань. Якщо менше, ніж за 100 додавань це зробити неможливо, вивести на екран -1.
Технічні умови
Ім'я програми
ADDS. *
Введення
З клавіатури вводиться ціле число N (від 10 до 10000)
Висновок
На екран або форму виводиться мінімальна кількість додавань для отримання паліндрома або -1, якщо за 100 додавань це зробити неможливо
Приклад
Введення
Висновок
1
3773
0
2
49
2
Рішення мовою Паскаль:
Var f1, f2: text; d1, d, n, b: string; j, i, k, s, x, y, cod: integer;
begin
assign (f1, 'adds.dat');
assign (f2, 'adds.sol');
reset (f1);
rewrite (f2);
readln (f1, n);
b: = '';
d1: = '';
for i: = length (n) downto 1 do b: = b + n [i];
if n = b then writeln (f2, '0')
else begin
k: = 0;
repeat
val (b, x, cod);
val (n, y, cod);
s: = x + y;
k: = k + 1;
str (s, d);
for j: = length (d) downto 1 do
d1: = d1 + d [j];
b: = d1;
n: = d;
until (d1 = d) or (k <100 font="">
end;
if (k <100 1="" f2="" font="" k="" then="" writeln="">
else writeln (f2, '- 1');
close (f1);
close (f2);
end.
Другий варіант
program adds;
var a, i, b, c, p: integer; f, f1, t: text; cod: integer;
s, s1, d: string; ki, k: integer;
begin
assign (f, 'adds.dat');
reset (f);
read (f, s);
k: = 1;
for i: = 0 to length (s) +1 do
d [i + 1]: = s [length (s) -i];
for i: = 1 to length (s) do d: = d + d [i];
assign (f1, 'adds.sol');
rewrite (f1);
if s <> d then writeln (f1,2) else writeln (f1,0);
close (f);
close (f1);
end.
Масиви
Hacker. Департамент фінансової підтримки незаможних використовує у своїй роботі три електронних списки: всіх студентів, список всіх школярів і список всіх вчителів. Зрозуміло, що не можна бути присутнім у всіх трьох списках одночасно. Однак, комп'ютерний зломщик - хакер проник в усі списки і незаконно отримує гроші в потрійному розмірі. Обсяги списків настільки величезні, що без допомоги комп'ютерної програми хакера не впіймати. Складіть програму ХАКЕР, що: 1. Вводить списки людей з текстових файлів STUDENT.DAT, PUPILS.DAT, TEACHER.DAT;
Знаходить людину, яка присутня у всіх трьох списках;
Виводить результат у текстовий файл HACKER.SOL.
У вихідних файлах інформація розташовується таким чином: кожен рядок містить послідовність з 10 цифр - код соціального страхування однієї людини; цей код однозначно описує БУДБО - будь-якого громадянина країни, в тому числі і хакера; в кожному файлі послідовність кодів впорядкована за зростанням. Єдиний рядок вихідного файлу має містити код хакера.
STUDENT.DAT
PUPILS.DAT
TEACHER.DAT
HACKER.SOL
00000000001
0000000005
00000000021
1000000001
10000000001
0000000007
00000000031
20000000002
1000000001
10000000001
30000000003
10000000091
50000000051
Рішення мовою Паскаль:
program HACKER;
const n = 1000;
var ST, PUP, HAC, TEA: array [1..n] of string [10];
j, s, i, k, q, w, e: integer;
f, f1, f2, f3: text; x: string;
begin
assign (f, 'students.dat');
rewrite (f);
close (f);
assign (f1, 'pupils.dat');
rewrite (f1);
close (f1);
assign (f2, 'teashers.dat');
rewrite (f2);
close (f2);
assign (f3, 'hacker.sol');
rewrite (f3);
close (f3);
writeln ('vvedite kol students'); readln (q);
writeln ('vvedite kod students');
for i: = 1 to q do readln (ST [i]);
writeln ('vvedite kol pupils'); readln (w);
writeln ('vvedite kod pupils');
for i: = 1 to w do readln (PUP [i]);
writeln ('vvedite kol teasher'); readln (e);
writeln ('vvedite kod teasher');
for i: = 1 to e do readln (TEA [i]);
for i: = 1 to q do begin
writeln ('ST (', i, ') =', ST [i]);
assign (f, 'students.dat');
append (f);
writeln (f, ST [i]);
close (f);
end;
for i: = 1 to w do begin
writeln ('PUP (', i, ') =', PUP [i]);
assign (f1, 'pupils.dat');
append (f1);
writeln (f1, PUP [i]);
close (f1);
end;
for i: = 1 to e do begin
writeln ('TEA (', i, ') =', TEA [i]);
assign (f2, 'teashers.dat');
append (f2);
writeln (f2, TEA [i]);
close (f2);
end;
for i: = 1 to q do
begin x: = ST [i];
for j: = 1 to w do
for s: = 1 to e do
if (x = PUP [j]) and (x = TEA [s]) then
begin
k: = k + 1;
HAC [k]: = x;
end;
end;
for i: = 1 to k do
begin
writeln (HAC [i]);
assign (f3, 'hacker.sol');
append (f3);
writeln (f3, HAC [i]);
close (f3);
end;
end.
Sport. У бігу беруть участь N спортсменів. Результати забігів занесені в масив по порядку номерів учасників. Визначити час (результат) бронзового призера.
Програма повинна читати дані з текстового файлу RUN.DAT наступного формату:
1-й рядок містить кількість учасників забігу;
Наступні рядки містять час кожного учасника забігу (по одному в кожному рядку) в послідовності номерів учасників.
Результат роботи програми міститься у файлі RUN.SOL.
Файл RUN.DAT
Файл RUN.SOL
5
25
19
22
17
18
2
Рішення мовою Паскаль:
program sport;
const n = 5;
var d, a: array [1..n] of integer; j, c, x, i: integer; f, f1: text;
begin
assign (f, 'RUN.dat');
rewrite (f);
close (f);
assign (f1, 'RUN.sol');
rewrite (f1);
close (f1);
writeln ('vvedite kolichestvo sportcmenov a potom rezyltat');
for i: = 0 to n do readln (d [i]);
for i: = 0 to n do begin
writeln (d [i]);
assign (f, 'd: \ run.dat');
append (f);
writeln (f, d [i]);
close (f);
end;
for i: = 0 to n do a [i]: = d [i];
for i: = 1 to n-1 do
for j: = i + 1 to n do
if a [i]> a [j] then
begin
c: = a [i];
a [i]: = a [j];
a [j]: = c
end;
x: = a [3];
for i: = 1 to n do if d [i] = x then begin
writeln ('dorozka', i);
assign (f1, 'RUN.sol');
append (f1);
writeln (f1, i);
close (f1);
end;
end.
TAB. Заповнити прямокутну таблицю розмірності NxM (M> N) вкладеними рамками, кожна з яких зображується числом, рівним різниці між N і номером рамки. Зовнішню рамку вважати першим. Приклад для N = 5, M = 8:
4
4
4
4
4
4
4
4
4
3
3
3
3
3
3
4
4
3
2
2
2
2
3
4
4
3
3
3
3
3
3
4
4
4
4
4
4
4
4
4
У вхідному файлі в першому рядку вводяться числа N і M. У файлі виводиться прямокутна таблиця.
Файл Z.dat
Файл Z.rez
3 березня
2 2 лютого
2 1 лютого
2 2 лютого
Рішення мовою Паскаль:
program tab;
var m, n, i, j, k: integer; a: array [1..100, 1..100] of integer;
begin
Write ('M ='); Readln (m);
Write ('N ='); Readln (n);
for k: = 1 to ((n-1) div 2) +1 do
for j: = k to n-k + 1 do
for i: = k to m-k + 1 do
a [i, j]: = n-k;
for j: = 1 to n do
begin
for i: = 1 to m do
Write (a [i, j]: 3);
Writeln ('');
end;
end.
Віза. Жителі однієї держави дуже люблять різні математичні головоломки. Навіть той, хто бажає отримати в'їзну візу, повинен вирішити задачу: відшукати ключове слово. Умова задачі такі: На листку написано кілька довгих чисел.


Приклад



1

4










Ключове слово










































































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

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