пʼятницю, 2 грудня 2016 р.

IІ етап Всеукраїнської учнівської олімпіади з інформатики 2016-2017 н.р.

Задача A. Олімпіада (100 балів)

Ім’я вхідного файлу: іnput.txt

Ім’я вхідного файлу: output.txt

Ліміт часу: 1с.

З метою якісної підготовки до олімпіади з інформатики учень Степан виділив певний час кожного дня на підготовку. Допоможіть вчителю інформатики визначити загальний час який учень готовився до олімпіади.
Вхідні даніУ першому рядку вхідного файлу записано N кількість днів підготовки, в наступних двох рядках початковий та кінцевий час в форматі Г Х С (без початкових нулів). При цьому він задовольняє обмеженням: Г - від 0 до 23, Х і С - від 0 до 60.
Вихідні даніУ вихідний файл виведіть в форматі Д Г Х С час, який Степан витратив на підготовку до олімпіади (де Д – кількість днів).

Приклади

іnput.txt
output.txt
1
13 10 0
15 30 10
0 2 20 10

20
0 0 0
12 0 0
10 0 0 0


Розв'язок даної задачі в середовищі Delphi 7 може бути таким:


program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
 f,g:text;n,a,b,c,d,e,l,h,hv,s:longint;
begin
  assign(f,'input.txt');
  assign(g,'output.txt');
  reset(f);
  rewrite(g);
  read(f,n);
  readln(f);
  read(f,a,b,c);
  readln(f);
  read(f,d,e,l);
  if c<=l then c:=l-c else begin e:=e-1;c:=60+l-c end ;
  if b<=e then b:=e-b else begin d:=d-1;b:=60+e-b end ;
  if a<=d then a:=d-a else a:=12+d-a;
  s:=(c*n) mod 60;
  hv:=(((c*n) div 60)+b*n) mod 60;
  h:=((((c*n) div 60)+b*n) div 60 +a*n) mod 24;
  d:=((((c*n) div 60)+b*n) div 60 +a*n) div 24;
  write(g,d,' ',h,' ',hv,' ',s);
  writeln(g);
  close(f);
  close(g)
end.


Задача B. Скарб (100 балів)
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 1с.
Знайти закопаний піратами скарб просто: все, що для цього потрібно - це карта. Як відомо, пірати зазвичай малюють карти від руки і описують алгоритм знаходження скарбу так: «Встаньте близько самотньою пальми. Пройдіть тридцять кроків у бік лісу, потім сімнадцять кроків у бік озера, ..., нарешті десять кроків у бік великого каменю. Скарб знаходиться під ним ». Велика частина таких вказівок просто зводиться до проходження якоїсь кількості кроків в одному з восьми напрямків (1 - північ, 2 - північний схід, 3 - схід, 4 - південний схід, 5 - південь, 6 - південний захід, 7 - захід, 8 -. північний захід) (див рис). Довжина кроку в будь-якому напрямку дорівнює 1.
Подорож по такому шляху зазвичай є прекрасним способом подивитися околиці, однак в наш час постійного поспіху ні у кого немає часу на це. Тому шукачі скарбів хочуть йти безпосередньо в точку, де заритий скарб. Наприклад, замість того, щоб проходити три кроки на північ, один крок на схід, один крок на північ, три кроки на схід, два кроки на південь і один крок на захід, можна пройти безпосередньо, використавши близько 3.6 кроку (див. Рис)

Вам необхідно написати програму, яка за вказівками піратів визначає точку, де заритий скарб.
 Вхідні дані
Перший рядок вхідного файлу містить число N - число вказівок (1≤N≤40). N Наступні рядків містять самі вказівки - номер напрямку (ціле число від 1 до 8) і кількість кроків (ціле число від 1 до 1000). Числа розділені пробілами.
Вихідні дані
У вихідний файл виведіть координати X і Y точки (два дійсних числа, розділені пробілом), де заритий скарб, вважаючи, що вісь Ox спрямована на схід, а вісь Oy - на північ. На початку скарбошукач повинен стояти на початку координат. Координати необхідно вивести з похибкою не більше 103.
Приклад
іnput.txt
output.txt
6
1 3
3 1
1 1
3 3
5 2
7 1
3.000 2.000
1
8 10
-7.071 7.071



Розв'язок даної задачі в середовищі Delphi 7 може бути таким:



program Project2;

{$APPTYPE CONSOLE}

uses

SysUtils;
var
f,g:text;n,i:integer;x,y:real;a,b:array[1..40]of integer;
begin
assign(f,'input.txt');
assign(g,'output.txt');
reset(f);
rewrite(g);
read(f,n);readln(f);
for i:=1 to n do begin
readln(f,a[i],b[i]);
case a[i] of
1:y:=y+b[i];
2:begin x:=x+b[i]/sqrt(2);y:=y+b[i]/sqrt(2)end;
3:x:=x+b[i];
4:begin x:=x+b[i]/sqrt(2);y:=y-b[i]/sqrt(2)end;
5:y:=y-b[i];
6:begin x:=x-b[i]/sqrt(2);y:=y-b[i]/sqrt(2)end;
7:x:=x-b[i];
8:begin x:=x-b[i]/sqrt(2);y:=y+b[i]/sqrt(2)end;
end; end;
write(g,x:5:3,' ',y:5:3);
writeln(g);
close(f);
close(g)
end.



Задача С. Дошка (100 балів)
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 1с.
 У кожній клітинці шашкової дошки довільного розміру в довільному порядку знаходяться шашки одного з кольорів: чорна, біла, червона, зелена.
 Скласти програму, що підраховує кількість шашок кожного кольору і що виводить результат якщо дані шашки, знаходяться у файлі (Приклад 1, Приклад 2) в першому рядку міститься кількість рядків N, в наступних N рядках записаних по рядках без пропусків у рядку і між рядками;
 результат зберігається у файлі (Приклад 1) у вигляді:
-  дані про місце розташування червоних шашок (в інших місцях знак “-“) ;
- порожній рядок;
- кількість чорних, білих, червоних і зелених шашок через пропуск;
якщо шашка якогось кольору відсутня на дошці то вивести у файл повідомлення BAD ІNPUT LІST (Приклад 2).

Приклад 0:
2
1
1
0
3
0
3
1
0
1
1
3
3
1
0
0
1
2
1
3
1
0
1
2
1
1
1
1
2
2
1
0
1
1
1
0
1
2
1
2
0
1
0
1
1
2
1
1
0
0
0
0
0
0
0
0
1
1
1
2
2
2
3
3


0 – колір і місце розташування ЧОРНОЇ шашки
1 – колір і місце розташування БІЛОЇ шашки
2 – колір і місце розташування ЧЕРВОНОЇ шашки
3 – колір і місце розташування ЗЕЛЕНОЇ шашки 



Приклади
іnput.txt
output.txt

іnput.txt
output.txt
8
21103031
01133100
12131012
11112210
11101212
01011211
00000000
11122233
2-------
--------
-2-----2
----22--
-----2-2
-----2--
--------
---222—

18 28 11 7


8
21113131
11133133
12131112
11112213
11121212
11111211
11113111
11122233
BAD ІNPUT LІST

Розв'язок даної задачі в середовищі Delphi 7 може бути таким:



program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
f,g:text;n,i,j,a,b,c,d:longint;r:string;
begin
assign(f,'input.txt');
assign(g,'output.txt');
reset(f);
rewrite(g);
read(f,n);readln(f);
for i:=1 to n do begin
read(f,r);
j:=1;
while j<=length(r) do begin
if r[j]='0' then begin a:=a+1;delete(r,j,1);insert('-',r,j) end;
if r[j]='1' then begin b:=b+1;delete(r,j,1);insert('-',r,j) end;
if r[j]='2' then c:=c+1;
if r[j]='3' then begin d:=d+1;delete(r,j,1);insert('-',r,j) end;
j:=j+1 end;
writeln(g,r);
readln(f);
end;
writeln(g);
if(a=0)or(b=0)or(c=0)or(d=0) then begin
rewrite(g);
write(g,'BAD INPUT LIST') end else
writeln(g,a,' ',b,' ',c,' ',d);
writeln(g);
close(f);
close(g)
end.

Задача D. Цвяхи (100 балів)
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 2с.
На прямій дощечці вбиті цвяхи. Будь-які два цвяхи можна з'єднати ниткою. Потрібно з'єднати якісь пари цвяхів ниткою так, щоб до кожного цвяху була прив'язана хоча б одна нитка, а сумарна довжина всіх ниток була мінімальна.
Вхідні дані
У першому рядку вхідного файлу записано число N – кількість цвяхів (2 ≤ N ≤ 100). У наступному рядку записано N чисел -
координати всіх цвяхів (невід'ємні цілі числа, не перевищують 10000).
Вихідні дані
У вихідний файл потрібно вивести єдине число мінімальну сумарну довжину всіх ниточок.
Приклад
іnput.txt
output.txt
5
4 10 0 12 2
6

Розв'язок даної задачі в середовищі Delphi 7 може бути таким:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function min(x,y:integer):integer;
begin
  if x<y then min:=x
  else min:=y;
end;

var
  n,i,j,c:integer; f,g:text;
  a,b:array[-1..100] of integer;
begin
  assign(f,'input.txt'); reset(f);
  assign(g,'output.txt'); rewrite(g);
  Read(f,n);
  for i:=1 to n do Read(f,a[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;
  for i:=1 to n do
    b[i]:=min(b[i-1],b[i-2])+(a[i]-a[i-1]);
  writeln(g,b[n]);
  close(f); 
close(g);
end.


Задача E. Міста (100 балів)
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 5с.
У файлі мститься N назв міст (по одній назві в кожному рядку). Утворіть з даного набору слів замкнений ланцюжок, в якому кожне наступне слово починається з літери, якою закінчувалось попереднє, використавши найбільшу кількість слів. Всі слова у файлі різні і у ланцюжку їх можна використовувати не більше одного разу. Програма повинна на екран та у перший рядок файлу вивести кількість використаних слів,.У випадку, коли ланцюжок утворити неможливо, у файлі міститься лише  одне число 0.
Вхідні дані
У першому рядку вхідного файлу записано число N – кількість цвяхів (2 ≤ N ≤ 50). У наступному рядку записано N слів великими латинськими літерами, які задають імена міст.
Вихідні дані
У вихідний файл потрібно вивести єдине число максимальну кількість міст.
Приклади
іnput.txt
output.txt
10
KYEV
DONETSK
LUTSK
KOVEL
VINNICA
DNIPROPETROVSK
KIROVOGRAD
LUGANSK
IVANO-FRANKOVSK
VINNICA
4



Розв'язок даної задачі в середовищі Delphi 7 може бути таким:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;


var r,s,t :array [1..50] of string; { для списку і ланцюжків }
 n:integer; { реальна кількість слів на вході }
 pc :integer; { вказівник на хвіст ланцюжка }
 k :integer; { довжина найдовшого ланцюжка }
 a :char; { Первичная буква для перебора }
 f,g:text; i : integer;


procedure dovzhuna; { запам'ятовує тільки найдовший ланцюжок }
begin
 if (pc>k) then begin
 t:=s;
 k:=pc;
 end;
end;
{ повертає вказівник назви по 1-й літері, 0 - такого елемента не має}
function next( c:char; m:integer ):integer;
var i:integer;
begin
 i:=1; next:=0;
 while (i <= n) and (m > 0) do begin
 if (r[i][1]=c) then m:=m-1;
 i:=i+1;
 end;
 if (m=0) then next:=pred(i);
end;
{ Алгоритм побудови ланцюжка. }
procedure perebir( c:char; m:integer ); { перебір з поверненням }
var i:integer; { відомий як "back-tracking" }
begin
 i:=next(c,m);
 if (i > 0) then begin
 pc:=pc+1; s[pc]:=r[i]; r[i][1]:='X'; { викреслюємо }
 perebir(r[i][length(r[i])], 1);
 pc:=pc-1; r[i][1]:=c; { повертаємо }
 perebir(c, m+1);
 end else dovzhuna;
end;

begin
 pc:=0; k:=0;
 assign(f,'input.txt'); reset(f);
 assign(g,'output.txt'); rewrite(g);
 fillchar(s,sizeof(s),0);
 readln(f,n);
 if (n > 50) then n:=50;
 for i:=1 to n do readln(f,r[i]);
 close(f);
 for a:='A' to 'Z' do perebir(a,1);
 writeln(g,k);
 if (k > 0) then begin
 for i:=1 to k do writeln(g,t[i]);
 end;
 close(g);
end.