Ідеї розв'язання задач ІІ етапу (районного, міського) Всеукраїнської олімпіади з інформатики

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

   При розв'язуванні цієї задачі зовсім не треба створювати модель шахової дошки та організовувати ходи за правилами згаданої шахової фігури. Оскільки рух лицаря здійснюються пріоритетно у двох напрямах, то неважко помітити, що стрибок коня може бути на наступну лінію, або через одну. Лицар зацікавлений у найбільшій кількості перемог і здійснює свій рух по можливості найшвидше у вибраному напрямку. Отже, він буде рухатися через одну лінію поки це можливо і останній хід робить на вибір: наступна чи через одну. Майже очевидно, що дошку розмірності N він подолає за N div 2 ходів. Якщо час поділити націло на N div 2, то отримаємо кількість перемог. Залишається визначити скільки часу лицар витратить на першу перемогу (тут він може долати неповну частину шляху). Це буде i div 2, де i - лінія з якої ми починамо рух.
   Тепер можна подивитися на програму:

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.

   Розв'язуючи останню задачу слід було здати, як розв'язок, не сам текст програми (так званий pas-файл), а його відкомпільований файл (так званий exe-файл). Тому слід було спочатку написати програму мовою Pascal, а вже потім компілятором відкомпілювати. Перейменування розширення файла з PAS в EXE не розв'язує цю задачу .
   Текст програми міг бути таким:

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>