double arrow

Олимпиадные задачи по информатике

Хоружий А.Н., руководитель ГМО

учителей информатики г. Брянки

Задача 1

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 7 4  
Пример 2 20 7 2  

Решение на языке Паскаль:

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] < N) and(N < W[i+1]) then

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.

Задача 2

«Несчастливые пиковые» числа. Трехзначное число назовем «пиковым», если его цифра десятков будет больше цифры единиц и сотен (напр., число 276 - «пиковое», а 954 и 277 - нет). Составьте программу, которая подсчитывает, сколько «пиковых» чисел находится на отрезке [A, B] и сколько из них делятся без остатка на 13.

Технические условия
Имя программы PICK.*
Ввод Два целых числа 100<=Ai<=Bi<=999
Вывод В текстовый файл PICK.SOL выводится количество «пиковых» чисел и тех из них, которые делятся без остатка на 13
Пример PICK.* PICK.SOL Объяснение
  135 145 4 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.

Задача 3

Отрезок. Отрезок на плоскости задается двумя несовпадающие конечными точками A (x1; y1) и B (x2; y2). С точки С (х3; у3) к прямой, содержащей отрезок АВ, проводится перпендикуляр г. Определить, попадает перпендикуляр на отрезок АВ или на его продолжение.

Во входном файле содержится три пары чисел, являющихся координатами точек А, В, С. В файле содержится ответ «На отрезок» или «На продолжение».

Пример входного и выходного файлов

 

Файл Z1.dat Файл Z1.rez
3 3 6 2 8 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) or (b1 < 0) 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.

Задача 4

Digit. В положительном целом числе вычеркнуть цифру так, чтобы число, которое осталось, было наибольшим.

  Файл Digit.dat Файл Digit.sol
Пример 1    
Пример 2    

Решение на языке Паскаль:

program Digit;

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 (a < c) then N:=10*b+c else if (a > b) and (b < c) then N:=10*a+c else N:=10*a+b;

assign(f1, 'Digit.sol');

rewrite(f1);

writeln('N=',N);

writeln(f1,N);

close(f1)

end.

Задача 5

Места. В плацкартном вагоне 54 места, которые расположены в девяти купе. Места от 1 до 36 основные и они расположены по четыре в купе (1 - 4 в первом,..., 33 - 36 в девятом), от 37 до 54 - боковые, разбиты по два, но расположение по купе обратное: места 37, 38 находятся в девятом купе, 39 и 40 в восьмом,..., 53 и 54 в первом. По номеру места определите номер купе.

Технические условия
Имя программы VAGON.*
Ввод С клавиатуры вводится целое число – номер места (от 1 до 54)
Вывод На экран выводится целое число - номер купе
Пример Ввод Вывод
     
       

 

Решение на языке Паскаль:

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.

Задача 1. Матрёшки.

Тип: сортировка массива

Сложность: средняя

На полке в магазине в ряд стоят матрешки. В каждой из них пока нет других, но существует возможность вставить одну матрешку в другую. Такая возможность существует, если разница высот составляет ровно 1 см и другая матрешка такой же высоты не находится в середине.

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

Входные данные. В первой строке входного файла input.dat записано количество матрешек N (1 ≤ N ≤ 10000). Во второй строке записаны N чисел, определяющих высоты соответствующих матрешек в сантиметрах. Каждое число находится в пределах от 1 до 109.

Выходные данные. В первую строку выходного файла output.dat необходимо вывести максимальное количество матрешек, которые могут быть последовательно вставлены друг в друга, а вторая строчка должна содержать номера таких матрешек в порядке увеличения высоты (если высоты матрешек повторяются, то покупатель берет первую из равновеликих, стояющих на полке).

Ограничение по времени: 0,5 секунды на тест.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: