Школьная олимпиада 2019 год 7- 8 классы
Имя входного файла: | Input.txt |
Имя выходного файла: | Output.txt |
Ограничение времени | 1 секунда на тест |
Ограничение по памяти | 32 Мб |
Задача 1
Шарики
Петя вспомнил о коробке с цветными шариками и стал придумывать игру. Все шарики выставил в линию. И стал рассматривать шарики слева направо. Когда обнаруживал непрерывную цепочку из трех и более шариков одного цвета, то удалял эти шарики из линии. Все оставшиеся шарики после удаления сдвигал друг к другу, и повторял описанную операцию до тех пор, пока было возможно. Игра занимала много времени, и он решил написать компьютерную программу.
Напишите и вы программу, которая определяет, сколько шариков будет удалено и какие шарики останутся.
Формат входного файла
В первой строке вводится количество шариков в цепочке (не более 1000).
Во второй строке цвета шариков (от 0 до 9, каждому цвету соответствует свое целое число).
Формат выходного файла
В первой строке требуется вывести количество шариков, которое будет удалено.
Во второй строке цвета оставшихся шариков или ничего, если все шарики были удалены
Пример:
Input.txt | Output.txt |
18 7 7 7 7 7 7 7 5 5 5 5 5 4 4 4 4 8 8 | 16 8 8 |
{Задача 1. Шарики 7-8 кл.}
var N:integer; {длина цепочки шариков}
r:array[1..1000] of byte; {оставшиеся неудаленными шарики}
i:integer; {количество цифр в числе N}
k:longint; {счетчик цикла}
a,b:byte; {для ввода цвета шариков: a - левый, b - правый}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N); {ввод количества шариков}
read(inf,a); {ввод левого шарика}
i:=0; {столько шариков остается}
k:=1; {количество подряд идущих одного цвета шариков}
while not(eof(inf)) do
begin
read(inf,b); {ввод правого шарика}
if a=b then
begin
inc(k); {увеличиваем счет одинаковых шариков}
continue; {продолжение ввода}
end
else
begin
if k=1 then
begin inc(i); r[i]:=a; end {одиночного цвета шарик}
else
if k=2 then {два шарика одинакового цвета}
begin inc(i); r[i]:=a; inc(i); r[i]:=a; end;
a:=b; {правый шарик делаем левым}
k:=1; {начинаем счет сначала для нового цвета}
end;
end;
{обработка последнего из шариков}
if k=1 then begin inc(i); r[i]:=a; end
else if k=2 then begin inc(i); r[i]:=a; inc(i); r[i]:=a; end;
writeln(outf,N-i); {вывод количества удаленных шариков}
for k:=1 to i do write(outf,r[k],' '); {вывод оставшихся цветов}
close(inf);
close(outf);
end.
Задача 2
Отношение
Даны два натуральных числа a и b. Найдите наибольшее значение отношения трехзначного числа из отрезка [a,b] к сумме его цифр.
Формат входного файла
Первая строка содержит два натуральных числа a и b (99ab.
Формат выходного файла
Файл должен содержать одно вещественное число- максимальное отношение с тремя цифрами после десятичной точки.
Пример:
Input.txt | Output.txt |
100 101 | 100.000 |
{Задача 2. Отношение 7-8 кл.}
var i:integer; {счетчик цикла}
a,b:integer; {левый и правый концы данного отрезка}
s:byte; {сумма цифр числа i}
x:integer; {для дублирования числа i}
y:real; {отношение числа к сумме цифр}
max:real; {наибольшее значение отношения}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,a,b); {ввод концов отрезка}
max:=-1; {инициализация max}
for i:=a to b do {цикл перебора целых чисел на отрезке}
begin
x:=i; {вычисление суммы цифр числа i}
s:=0;
while x0 do
begin
s:=s+(x mod 10);
x:=x div 10;
end;
y:=i/s; {вычисление отношения}
if max
end;
writeln(outf,max:0:3); {вывод результата}
close(inf);
close(outf);
end.
Задача 3
Волшебный Мост
Крестьянин, возвращаясь с ярмарки, увидел на мосту странную картину. Какой-то человек сначала считал деньги в кошельке, затем бросал в реку несколько монеток, бежал на другой конец моста, снова считал деньги в кошельке, и опять бросал несколько монеток и шёл на другой конец моста. Наконец, пересчитав свои деньги, он явно обрадовался и отправился в дальнейший путь.
- Что ты делал? Зачем ты бросал деньги в воду? – спросил крестьянин, догнав странного человека.
Видя, что свой секрет скрыть не удастся, человек рассказал, что мост волшебный. Если бросить с моста ровно 29 копеек, то, как только пройдёшь мост, количество рублей в оставшейся сумме денег превращаются в новой сумме в количество копеек, а копейки – в рубли. Перейдя мост несколько раз, можно получить сумму, намного больше первоначальной.
- Самое важное – вовремя остановиться, - сказал человек и ушёл.
Крестьянин задумался, достал кошелёк и пересчитал свои деньги. У него было 46 рублей 47 копеек. «29 копеек – не деньги, дай-ка попробую». После первого прохода у него получилось 18 рублей 46 копеек, после второго прохода – 17 рублей 18 копеек, а после третьего – 89 рублей 16 копеек. «Ух-ты! А ещё больше можно получить?» - обрадовался крестьянин. После четвёртого прохода у него стало 87 рублей 88 копеек, после пятого – 59 рублей 87 копеек, после шестого – 58 рублей 59 копеек, после седьмого – 30 рублей 58 копеек, после восьмого – 29 рублей 30 копеек, после девятого – 1 рубль 29 копеек, а после десятого осталась 1 копейка.
«Эх, надо было после третьего раза остановиться!» - расстроился крестьянин.
Напишите программу, которая по начальной сумме денег у крестьянина и заданному количеству копеек, которое необходимо бросать с моста, определит оптимальное число проходов по мосту для получения наибольшей конечной суммы.
Формат входного файла
В первой строке содержится целое число М – количество копеек, которые нужно бросать с моста (1
Формат выходного файла
Файл должен содержать единственное число - наименьшее количество проходов по мосту, необходимое для получения максимально возможной суммы денег.
Пример:
Input.txt | Output.txt |
29 46 47 | 3 |
{Задача 3. Волшебный Мост 7-8 кл.}
var M:integer; {размер презента реке за один проход, копеек 0
R,K:integer; {рублей, копеек}
pr:integer; {счетчик проходов}
x:integer; {для обмена рублей и копеек значениями}
rmax,kmax:integer; {максимальная сумма в руках}
prmax:integer; {номер прохода, когда сумма максимальная}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
readln(inf,M); {ввод размера презента}
readln(inf,R,K); {ввод рублей, копеек}
pr:=0; {инициализация переменных}
Rmax:=R;
Kmax:=K;
prmax:=pr;
while (R0) or (K0) do {пока денежки имеются, посматриваем все варианты}
begin
dec(K,M); {вычли копейки}
if K
begin
inc(K,100); {нашли 100 копеек}
dec(R); {потеряли рубль}
if R если оказывается терять нечего, выходим из цикла}
end;
x:=R; {рубли и копейки меняем значениями}
R:=K;
K:=x;
inc(pr); {считаем проходы}
if R*100+K Rmax*100+Kmax then {если получили бо-o-oльшую сумму,}
begin
Rmax:=R; {запоминаем как максимальную на текущий проход}
Kmax:=K;
prmax:=pr;
end;
end;
writeln(outf,prmax); {вывод результата}
close(inf);
close(outf);
end.
Задача 4
Привал
Путник двигался t1 часов со скоростью v1, t2 часов со скоростью v2, ..., tn часов со скоростью vn. За какое время он одолел первую половину пути (после чего запланировал привал)?
Формат входного файла
Первая строка содержит единственное число N - количество участков пути. Следующие N строк содержат по два числа ti и vi, разделенных пробелом. Все числа в файле натуральные и не превышают 100.
Формат выходного файла
Файл должен содержать одно действительное число с тремя знаками после десятичной точки - время преодоления первой половины пути.
Пример:
Input.txt | Output.txt |
3 3 5 4 4 6 2 | 4.625 |
{Задача 4. Привал 7-8 кл.}
var N:integer; {количество интервалов пути}
i:integer; {счетчик цикла}
tv:array[1..100,1..2] of byte; {массив времен и скоростей}
s:longint; {длина всего пути}
x:real; {половина пути}
y:real; {осталось до половины пути}
t:real; {время прохождения половины пути}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N); {ввод количества интервалов пути}
s:=0; {инициализация длины пути}
for i:=1 to N do {цикл ввода времен и скоростей и вычисления длины пути}
begin
read(inf,tv[i,1],tv[i,2]); {ввод времен и скоростей}
s:=s+tv[i,1]*tv[i,2]; {вычисление длины пути}
end;
x:=0;
t:=0;
for i:=1 to N do {цикл вычисления точки середины пути}
begin
y:=tv[i,1]*tv[i,2]; {вычисление длины интервала}
if x+yищем середину пути}
begin
x:=x+y; {суммирование длин интервалов}
t:=t+tv[i,1]; {суммирование времен прохождения интервалов}
end
else
begin
y:=s/2-x; {длина до середины пути}
t:=t+y/tv[i,2]; {время прохождения длины y}
break; {выход из цикла по i}
end;
end;
writeln(outf,t:0:3); {вывод результата}
close(inf);
close(outf);
end.
Задача 5
Наименьшее количество
Найти количество натуральных чисел из отрезка [a,b], имеющих наименьшее количество делителей.
Формат входного файла
Первая строка содержит два натуральных числа a и b. (1ab
Формат выходного файла
Файл должен содержать два натуральных числа: количество таких чисел и минимальное количество делителей.
Пример:
Input.txt | Output.txt |
2 6 | 3 2 |
{Задача 5. Наименьшее количество 7-8 кл.}
var a,b:integer; {левый и правый концы данного отрезка}
d:integer; {очередной делитель}
i:integer; {счетчик цикла}
k:integer; {количество чисел отрезка с наименьшим количеством делителей}
kmin:integer; {наименьшее количество делителей}
ki:integer; {количество делителей числа i}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,a,b); {ввод концов отрезка}
kmin:=1001; {инициализация kmin}
k:=0; {инициализация k}
for i:=a to b do {цикл перебора целых чисел на отрезке}
begin
ki:=0; {количество делителей числа i}
d:=1; {первый делитель числа i}
while d*d
begin
if i mod d =0 then
if d*d=i then inc(ki) {один делитель, 5*5=25}
else inc(ki,2); {два делителя, 2*12=24}
inc(d);
end;
if kiсчет k сначала}
else if ki=kmin then inc(k); {продолжение счета k}
end;
writeln(outf,k,' ',kmin); {вывод результатов}
close(inf);
close(outf);
end.
Задача 6
Из одних 5
Дано натуральное число N (0N9). Найти наименьшее натуральное число больше данного, составленного из одних 5.
Формат входного файла
Первая строка содержит единственное натуральное число N
Формат выходного файла
Файл должен содержать одно натуральное число
Пример:
Input.txt | Output.txt |
234 | 555 |
{Задача 6. Из одних пятерок 7-8 кл.}
var N:longint; {данное число 0
x:longint; {для дублирования числа N}
b:byte; {старшая цифра числа x}
inf,outf:text;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N); {ввод исходного числа}
x:=N; {дублирование числа N}
while x0 do
begin
b:=x mod 10; {отсекаемая правая цифра числа x}
x:=x div 10; {отсечение правой цифры числа x}
write(outf,5); {вывод очередной пятерки}
end;
if 5приписывание еще одной пятерки}
close(inf);
close(outf);
end.
Задача 7
Нули
Дано натуральное число N.
Рассмотрим выражение N+2N+3N+4N+…+K•N. На сколько нулей заканчивается его значение в десятичной записи?
Формат входного файла
Первая строка содержит два натуральных числа N и K (1 K
Формат выходного файла
Файл должен содержать единственное число – количество нулей, на которые оканчивается десятичная запись значения выражения.
Пример:
Input.txt | Output.txt |
4 5 | 1 |
25 8 | 2 |
{Задача 7. Нули 7-8 кл.}
var N:integer; {исходное число}
K:integer; {исходное число}
k2:integer; {сколько раз 2 входит в разложение числа на множители}
k5:integer; {сколько раз 5 входит в разложение числа на множители}
inf,outf:text;
function F(n:integer; d:integer):integer;
{Функция считает сколько раз d входит в разложение числа n на множители}
var kd:integer; {сколько раз d входит в разложение числа n на множители}
begin
kd:=0;
while true do
begin
if n mod d =0 then
begin
inc(kd); {счет делителей d для n}
n:=n div d;
end
else
begin
F:=kd;
break; {выход из процедуры}
end;
end;
end;
begin
assign(inf,'input.txt');
assign(outf,'output.txt');
reset(inf);
rewrite(outf);
read(inf,N,K); {ввод исходных чисел}
{N+2N+3N+4N+...+K*N = N*(1+2+3+4+...+K) = N*K*(K+1)/2}
{Произведение может быть большим, поэтому ищем количество парных 2 и 5 в разложении произведения на множители, а именно отдельно сколько 2 и 5 в N, в K и в (K+1), а затем суммируем количество 2 и количество 5}
k2:=F(N,2)+F(K,2)+F(K+1,2)-1; {считаем двойки}
k5:=F(N,5)+F(K,5)+F(K+1,5); {считаем пятерки}
if k2выводим большее}
else writeln(outf,k5);
close(inf);
close(outf);
end.