11 класс 4 задача 1) Нам нужно определить площадь треугольника, одно из оснований которого лежит на оси ОХ. Пусть длина этого основания равна B, а высота треугольника равна H. Тогда площадь треугольника равна S = BH/2. Из этих рассуждений следует, что треугольник с максимальной площадью образован двумя точками на оси ОХ, которые дальше всего остоят друг от друга, и точкой, которая наиболее удалена от оси ОХ, то есть имеет максимальную координату y (по модулю). Таким образом, нужно найти: 1) xMin – минимальное значение x-координаты среди всех точек, для которых y-координата равна нулю; 2) xMax – максимальное значение x-координаты среди всех точек, для которых yкоордината равна нулю; 3) yMax – максимальный модуль y-координаты среди всех точек. Тогда S = (xMax – xMin)yMax/2. Единственная сложность состоит в том, чтобы записать в переменные xMax и xMin некоторые начальные значения, которые позволят определить, что еще ни одной точки на оси ОХ не найдено. Например, можно записать в них два нуля, но как тогда различить ситуации «ни одна точка на оси ОХ не найдена» и «найдена одна точка на оси ОХ с координатой x=0»? Можно ввести еще одну логическую переменную (назовём её Found), которая сначала равна False (ни одна точка на оси ОХ не найдена), и получает значение True, когда такая точка найдена. program Points; var i, N, x, y: integer; xMin, xMax, yMax: integer; Found: boolean; begin Found:= False; xMin := 0; xMax := 0; yMax := 0; Readln(N); for i:=1 to N do begin Readln(x,y); if y = 0 then begin if not Found or (x < xmin) then xMin:= x; if not Found or (x > xmax) then xMax:= x; Found:= True; end else if abs(y) > ymax then ymax:= abs(y); end; writeln((xMax - xMin) * yMax / 2); end. 10 Класс Задача 4 1) В этой задаче нужно считать, сколько раз встречается во входной последовательности каждая цифра. Для этого используется массив счетчиков var num: array['1'..'9'] of integer; Этот массив сначала заполняем нулями: for c:='1' to '9' do num[c] := 0; Тогда цикл ввода данных получается почти такой же, как в предыдущей задаче: repeat read(c); if ('1' <= c) and (c <= '9') then num[c] := num[c] + 1; until c = '.'; В принципе, нас не интересует число цифр, поэтому вместо увеличения num[c] на единицу можно просто записывать туда 1 num[c]:= 1; или даже сделать логический массив вместо целочисленного (оставим это в качестве упражнения). Теперь остается вывести все цифры (начиная с младшей), для которых элемент массива num равен нулю. Для того, чтобы обработать случай, когда все цифры 1..9 есть во входных данных нет, введем счетчик цифр count, который будем увеличивать на 1, получив ненулевую цифру. count:=0; for c:='1' to '9' do begin if num[c] = 0 then write(c) else count := count + 1; end; После этого цикла нужно проверить счетчик count: если он равен 9, выводим «0» (все цифры встретились во входных данных). Приведем полное решение (И. Титков): var num: array['1'..'9'] of integer; c: char; count: integer; begin for c:='1' to '9' do num[c] := 0; repeat read(c); if ('1' <= c) and (c <= '9') then num[c]:= 1; until c = '.'; count := 0; for c:='1' to '9' do begin if num[c] = 0 then write(c) else count := count + 1; end; if count = 9 then writeln('0'); end.