Ідеї розв'язання задач ІІ етапу (районного, міського) Всеукраїнської олімпіади з інформатики
Задача 1.
Для тих учасників олімпіади, які беруть участь в заочній олімпіаді з програмування і розв'язували задачі другого туру, багато чого в цій задачі було знайомим. До годин (H1) додаємо 24. Для хвилин ситуація така. Якщо кінцеве значення менше початкового, то позичте годину (H1:=H1-1) та добавте 60 хвилин. Аналогічно і з секундами. А далі справа техніки, порахувати різницю в секундах (h*3600+m*60+s) і вивести результат, порівнявши значення сну першого і другого.
program Z1;
var H,M,S,H1,M1,S1,H2,M2,S2,R1: word;
T,T1,R2: longint;
f: text;
procedure vvid; {Введення даних з файла}
Begin
assign(f,'son.dat');
reset(f);
readln(f,H,M,S);
readln(f,H1,M1,S1);
read(f,T);
close(f)
End;
procedure vyvid; {Виведення результатів у файл}
Begin
assign(f,'son.sol');
rewrite(f);
writeln(f,r1);
writeln(f,r2);
close(f)
End;
procedure son1; {Визначення годин, хвилин і секунд сну першого. Це h2,m2,s2}
begin
h1:=h1+24;
if s1<s then begin m1:=m1-1; s1:=s1+60;end;
s2:=s1-s;
if m1<m then begin h1:=h1-1; m1:=m1+60;end;
m2:=m1-m;
h2:=h1-h;
end;
procedure hmss; {Перетворення часу сну першого у секунди.}
begin
t1:=h2*3600+m2*60+s2;
end;
procedure analiz; {Порівняння часу сну і формування результатів r1, r2}
begin
if t1>t then r1:=1;
if t>t1 then r1:=2;
if t=t1 then r1:=0;
r2:=abs(t-t1);
end;
Begin {Сама програма}
vvid;
son1;
hmss;
analiz;
vyvid
End.
Задача 2.
Дану задачу можна було розв'язати зчитуючи з вхідного файлу по 24 символи (0 і 1). Наступним кроком кожні три замінимо відповідно 0 чи 1. Після чого рядком write(chr(num)) виводимо розкодований символ.
Текст програми:
program z2;
const fi_name='KOD.TXT';
fo_name='UNKOD.TXT';
var fi, fo:text;
n, i, j, t, t1, t2, t3, sum:integer;
cod:word;
c:char;
st, st_n:string;
function bintodec (s:string):byte; {Переведення восьмирозрядного двійкового коду в десяткову систему числення}
var t, k, p, i:byte;
begin
t:=0; k:=1;
for i:=8 downto 1 do
begin
val (s[i],p,cod);
t:=t+p*k;
k:=k*2;
end;
bintodec:=t;
end;
begin {Основна програма}
assign (fi, fi_name);
reset (fi);
assign (fo, fo_name);
rewrite (fo);
while not(eof(fi)) do
begin
i:=1; st:='';
while (i<=24) do
begin
read (fi, c);
st:=st+c;
inc(i);
end;
st_n:='';
for t:=1 to 8 do
begin
val (copy (st,3*t-2,1), t1, cod);
val (copy (st,3*t-1,1), t2, cod);
val (copy (st,3*t,1), t3, cod);
sum:=t1+t2+t3;
if sum>1 then st_n:=st_n+'1' else st_n:=st_n+'0';
end;
write (fo, chr(bintodec(st_n)));
end;
close(fi);
close(fo);
end.
Задача 3.
var k,i,j,n,t : longint;
s : string;
cod : integer;
begin
assign(input,'victory.in');reset(input);
assign(output,'victory.out');rewrite(output);
readln(n,t);
readln(s);
i:=1;
while s[i] in ['a'..'z'] do delete(s,1,1); {Нам потрібний лише номер лінії початку руху}
val(s,i,cod); {i - лінія початку руху}
if i>n div 2 then i:=n-i+1;
{нехай i буде менше половини шляху - будемо починати рухатися донизу (південь)}
if t<i div 2 then k:=0 else k:=(t-i div 2)div(n div 2)+1;
{якщо не встигаємо отримати першу перемогу то k=0, інакше до першої
перемоги додаємо решту, що можемо отримати}
if (i=1) or (i=n) then dec(k);
{якщо починаємо з першої лінії, то не рахуємо першу перемогу.
Умова i=n тут уже не потрібна: i завжди менше n - ми ж робили переприсвоєння}
writeln(k); {вивели кількість перемог}
close(input);
close(output);
end.
Задача 4.
program Z4;
var f : text;
begin
assign(f,'anketa.txt');rewrite(f);
writeln(f,'svoe prizvysche');
writeln(f,'svoe im''ia');
writeln(f,'svoya shkola');
writeln(f,'sviy klas');
writeln(f,'prizvysche vchytelia');
close(f);
end.
Компіляцію можна було зробити з командного рядка >tpc z4.pas або, налаштувавши каталоги середовища і відповідні опції, так:
<F10> <Compile> <Destination> <Disk> <Alt+F9>