Хоружий А.Н., руководитель ГМО
учителей информатики г. Брянки
Задача 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 секунды на тест.