- •Тема: Перебор вариантов. Задача 1. Замечательные числа
- •Задача 2. Острова
- •Задача 3 Клавиатура
- •Задача 4 . Вырубка деревьев
- •Краткие методические рекомендации по решению задачи
- •Оценка решения
- •Формат входных данных
- •Формат выходных данных
- •Работа с большими числами
- •Золото племени абба
- •Сортировка и поиск
- •2. Домашнее задание.
- •Метод перебора вариантов, отсечения перебора
- •Сумма двух чисел
- •Элементы вычислительной геометрии
- •4. Две окружности
- •Эффективные структуры данных
- •5. Поиск прямоугольников (Время: 0,5 сек. Память: 16 Мб Сложность: 34%)
- •Тема 1: «Работа с длинными числами»
- •Тема 2: Алгоритмы поиска и сортировки
- •Тема 3: Аналитическая геометрия
- •Тема 4: Перебор вариантов
- •Тема 5: Строки. Элементы лексического и синтаксического разобра
- •Задача 3. "Функция"
- •Ограничения
- •Площади покрытия антенны
- •Площадь покрытия решение
- •Элементы лексического и синтаксического разбора Шифровка
- •Шифровка Решение
- •Сортировка и поиск Независимые судьи
- •Независимые судьи Решение
- •Сувениры
- •Сувениры Решение
- •Треугольник Условие задачи
- •Треугольник Решение
- •Олимпиадные задачи по информатике
- •Задача 1. «Код да Винчи»
- •Задача 3 «Буквы»
- •Задача 4 «Соревнования»
- •Задача «Красивая последовательность»
- •Тема: Задача на динамическое программирование
- •Динамическое программирование Задача: Черепашка
- •Решение
- •Тема: Работа с большими числами
- •Тема: Сортировка и выбор
- •Задача. Подземная дорога (поиск в ширину)
- •Формат входных данных
- •Задача rebus
- •Задача “Эчпочмаки”
- •Задача “Ниточка”
- •Задача “Обезьяны”
- •Задача Интересное число
Сортировка и поиск
2. Домашнее задание.
Петя успевает по математике лучше всех в классе, поэтому учитель задал ему сложное домашнее задание, в котором нужно в заданном наборе целых чисел найти сумму всех положительных элементов, затем найти где в заданной последовательности находятся максимальный и минимальный элемент и вычислить произведение чисел, расположенных между ними. Так же известно, что минимальный и максимальный элемент встречаются в заданном множестве чисел только один раз. Поскольку задач такого рода учитель дал Пете около ста, то Петя как сильный программист смог написать программу, которая по заданному набору чисел самостоятельно находит решение. А Вам слабо?
Входные данные
В первой строке входного файла INPUT.TXT записано единственное число N – количество элементов массива. Вторая строка содержит N целых чисел, представляющих заданный массив. Все элементы массива разделены пробелом. Каждое из чисел во входном файле не превышает 102 по абсолютной величине.
Выходные данные
В единственную строку выходного файла OUTPUT.TXT нужно вывести два числа, разделенных пробелом: сумму положительных элементов и произведение чисел, расположенных между минимальным и максимальным элементами. Значения суммы и произведения не превышают по модулю 3*104. Примеры:
№ |
INPUT.TXT |
OUTPUT.TXT |
1 |
6 -3 5 7 9 0 5 |
26 35 |
2 |
8 1 2 3 4 5 6 7 8 |
36 5040 |
3 |
5 8 7 5 -3 2 |
22 35 |
РЕШЕНИЕ
Данная задача решается с помощью классических алгоритмов обработки данных в массиве. Во первых, стоит вычислить сумму всех положительных элементов, которые находятся в массиве. Для этого пройдемся по всем значениям и к значениям суммы будем прибавлять только те элементы, которые больше «0» (то есть, положительные).
Sum:=0; for i:=1 to n do if a[i]>0 then Sum:=Sum+a[i];
Далее, согласно условия, нам необходимо найти индексы наибольшего и наименьшего значения элементов в массиве. Введем две переменные minId, MaxId, которые соответственно содержат значения номеров маленького и самого элементов линейной таблицы. Если среди просмотренных элементов мы найдем большее значение, чем то значение, которое мы считали начальным - мы изменим номер индекса максимального элемента
if a[i]>a[MaxId] then MaxId:=i;
Аналогично с минимальным:
if a[i]<a[MinId] then MinId:=i;
Зная позицию нахождения наибольшего и наименьшего элементов, мы можем найти произведение чисел, расположенных между ними:
Mult:=1; for i:=MinId+1 to MaxId-1 do Mult:=Mult*a[i];
Но необходимо предусмотреть также и такой вариант, когда минимальный элемент находится правее максимального, ведь тогда цикл for i:=MinId+1 to MaxId-1 do не выполнится ни разу. Поэтому перед этим, при необходимости необходимо заменить сменные minId и MaxId так, чтобы у minId находилось меньшее число, чем в MaxId.
if MaxId<MinId then begin x:=MaxId; MaxId:=MinId; MinId:=x; end;
Полный текст программы «Домашнее задание»:
var f,f1:text; n,i,minId,MaxId,x,Sum,Mult:Integer; a:array[1..100] of Integer; begin assign(f,’input.txt’); reset(f); assign(f1,’output.txt’); rewrite(f1);
{Считывание данных}
readln(f,n); for i:=1 to n do read(f,a[i]);
{ Нахождение суммы положительных элементов массива}
Sum:=0; for i:=1 to n do if a[i]>0 then Sum:=Sum+a[i];
{ Поиск значений индексов расположения максимального элемента и минимального}
minId:=1;
{ Считаем, что минимальный элемент находится на первой позиции}
MaxId:=1;
{ Считаем, что максимальный элемент находится на первой позиции}
for i:=2 to n do begin if a[i]>a[MaxId] then MaxId:=i;
{ Если мы нашли больше элемент чем считали максимальным, меняем индекс максимального}
if a[i]<a[MinId] then MinId:=i;
{Если мы нашли меньше элемент чем считали минимальным, меняем индекс минимального}
end;
{Изменение индексов расположения крупнейшего элемента и наименьшего}
if MaxId<MinId then begin x:=MaxId; MaxId:=MinId; MinId:=x; end;
{Нахождение произведения между минимальным и максимальным значением элементов массива}
Mult:=1; for i:=MinId+1 to MaxId-1 do Mult:=Mult*a[i];
{Вывод результата}
writeln(f1,Sum,’ ‘,Mult); close(f); close(f1); end.
