Школьный этап олимпиады по информатике 9-11 классы 2017-18 учебный год.
Задача 1. Покупка
Ручка стоила K рублей. Первого сентября стоимость ручки увеличилась ровно на P процентов. Определите, сколько ручек можно купить на S рублей после подорожания. Программа получает на вход три целых положительных числа. Первое число K – стоимость ручки в рублях до подорожания. Второе число P – величина подорожания ручки в процентах. Третье число S – имеющаяся сумма денег. Числа K и S не превосходят 107, число P не превосходит 100. Program n1; var k,p,s,n:longint; begin ReadLn(k); ReadLn(p); ReadLn(s); k := 100 * k + p * k ; writeln(100 * s div k); end. |
Задача 2. Плот
Посередине озера плавает плот, имеющий форму прямоугольника. Стороны плота направлены вдоль параллелей и меридианов. Введём систему координат, в которой ось OX направлена на восток, а ось ОY – на север. Пусть юго-западный угол плота имеет координаты (x1, y1), северо-восточный угол – координаты (x2, y2).
Пловец находится в точке с координатами (x, y). Определите, к какой стороне плота (северной, южной, западной или восточной) или к какому углу плота (северо-западному, северо-восточному, юго-западному, юго-восточному) пловцу нужно плыть, чтобы как можно скорее добраться до плота.
Программа получает на вход шесть чисел в следующем порядке: x1, y1 (координаты
- угла плота), x2, y2 (координаты северо-восточного угла плота), x, y (координаты (x, y) пловца). Все числа целые и по модулю не превосходят 100. Гарантируется, что x1<x2, y1<y2, x ≠ x1, x ≠ x2, y ≠ y1, y ≠ y2, координаты пловца находятся вне плота.
Если пловцу следует плыть к северной стороне плота, программа должна вывести символ «N», к южной – символ «S», к западной – символ «W», к восточной – символ «E». Если пловцу следует плыть к углу плота, нужно вывести одну из
следующих строк: «NW», «NE», «SW», «SE».
program zadasja2;
var x,y,x1,y1,x2,y2:integer;
s:string;
begin
Write('Координата Х пловца =');ReadLn(x);
Write('Координата Y пловца =');ReadLn(y);
// координаты плота
x1:=-1;
y1:=-2;
x2:=5;
y2:=3;
if (y > y2) then s:=s+'N';
if (y < y1) then s:=s+'S';
if (x < x1) then s:=s+'W';
if (x > x2) then s:=s+'E';
writeln ('Напрвыление на плот =',s);
end.
Задача 3. Пакуем чемоданы!
Алёна собирает вещи в отпуск. С собой в самолёт она может взять ручную кладь и багаж. Для ручной клади у Алёны есть рюкзак, а для багажа – огромный чемодан.
По правилам перевозки масса ручной клади не должна превосходить S кг, а багаж может быть любой массы (за сверхнормативный багаж Алёна готова доплатить). Разумеется, наиболее ценные вещи – ноутбук, фотоаппарат, документы и т. д. – Алёна хочет положить в ручную кладь.
Алёна разложила все свои вещи в порядке уменьшения их ценности и начинает складывать наиболее ценные вещи в рюкзак. Она действует следующим образом – берёт самый ценный предмет, и если его масса не превосходит S, то кладёт его в рюкзак, иначе кладёт его в чемодан. Затем она берёт следующий по ценности предмет, если его можно положить в рюкзак, то есть если его масса вместе с массой уже положенных в рюкзак вещей не превосходит S, то кладёт его в рюкзак, иначе в чемодан, и таким же образом процесс продолжается для всех предметов в порядке убывания их ценности. Определите вес рюкзака и чемодана после того, как Алёна сложит все вещи. Первая строка входных данных содержит число S – максимально разрешённый вес рюкзака. Во второй строке входных данных записано число N – количество предметов. В следующих N строках даны массы предметов, сами предметы перечислены в порядке убывания ценности (сначала указана масса самого ценного предмета, затем масса второго по ценности предмета и т. д.). Все числа натуральные, число S не превосходит 2×109, сумма весов всех предметов также не превосходит 2×109. Значение N не превосходит 105. Программа должна вывести два числа – вес рюкзака и вес чемодана (вес пустого рюкзака и чемодана не учитывается).
program zadasja3;
var s1,s2,a,n,s,i:Integer;
begin
Write('Масса ручной клади =');ReadLn(s);
Write('Количество вещей = ');ReadLn(n);
for i:=1 to n do
begin
Write('Введи массу',i,' вещи = ');ReadLn(a);
if (s1 + a <= s) then s1:=s1+a else s2:=S2+a;
end;
writeln('Масса рюкзака =',s1:10);
writeln('Масса рюкзака =',s2:10);
end.
Задача 4. Туристический налог
Для пополнения бюджета в стране Авалон, известной своими горными туристическими маршрутами, ввели новый налог для туристов. Величина налога пропорциональна длине маршрута, но, поскольку маршрут проходит по горам и пройденное расстояние, зависящее от высоты спуска и подъёма, подсчитать сложно, налог считается без учёта высоты, то есть величина налога пропорциональна горизонтальному перемещению, совершённому туристической группой. Кроме того, в силу старинного обычая все туристические группы должны перемещаться по горам Авалона строго с запада на восток.
Турфирма хочет сэкономить на налоге, поэтому она хочет разработать туристический маршрут с минимальной величиной налога. При этом, поскольку маршрут является горным, он должен содержать подъём в гору и спуск с горы, то есть на маршруте должна быть точка, которая находится строго выше начала и конца маршрута.
Турфирма составила карту гор Авалона, содержащую информацию о высоте гор при передвижении с запада на восток. Высоты гор измерены в точках через равные расстояния. Найдите на данной карте гор Авалона туристический маршрут минимальной длины, удовлетворяющий условию наличия подъёма и спуска.
Первая строка входных данных содержит число N – количество точек на карте гор Авалона. СледующиеN строк содержат информацию о высоте гор в данных N точках при движении с запада на восток. Все числа натуральные, не превосходящие 105.
Программа должна вывести два числа – номер точки начала маршрута и номер точки окончания маршрута. Точки нумеруются от 1 до N. Если маршрута, удовлетворяющего условиям, не существует, программа должна вывести одно число 0.
Автор Воротников Илья (11 класс 2017 год)
Program n1;
varn:array[1..100000]of integer;
k,i,max:longint;
begin
max:=n[1];
Readln(k);
fori:=1 to k do Begin
Readln(n[i]);
end;
fori:=1 to k do Begin
if(n[i]>max)then
max:=n[i];
end;
if(max=n[1])or(max=n[k])then writeln(0)
else
for i:=1 to k do begin
if(n[i]=max)and(n[i]<>n[i-1]) then writeln(i-1);
if(n[i]=max)and(n[i]<>n[i+1])then writeln(i+1)
end;
end.
Задача 5. Делимость
Сегодня в школе на уроке математики проходят делимость. Чтобы продемонстрировать свойства делимости, учитель выписал на доске все целые числа от 1 до N в несколько групп, при этом если одно число делится на другое, то они обязательнооказались в разных группах. Например, если взять N = 10, то получится 4 группы.
Первая группа: 1. Вторая группа: 2, 7, 9. Третья группа: 3, 4, 10. Четвёртая группа: 5, 6, 8.
Вы уже догадались, что, поскольку любое число делится на 1, одна группа всегда будет состоять только из числа 1, но в остальном подобное разбиение можно выполнить различными способами. От вас требуется определить минимальное число групп, на которое можно разбить все числа от 1 до N в соответствии с приведённым выше условием.
Программа получает на вход одно натуральное число N, не превосходящее 109, и должна вывести одно число – искомое минимальное количество групп.
Program n1;
Var a,n,p:LongInt;
begin
Write('n = ');ReadLn(n);
a:= 1;
p:= 1;
while (2 * p <= n) do
begin
p:=p * 2;
a:=a + 1;
end;
Writeln('Групп ',a:10);
end.