11 класс 4 задача

advertisement
11 класс
4 задача
1) Нам нужно определить площадь треугольника, одно из оснований которого лежит на оси ОХ.
Пусть длина этого основания равна B, а высота треугольника равна H. Тогда площадь
треугольника равна S = BH/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.
Download