Немного о "С4"

Программы и исходники задач


Задача 1 (скачать)

Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности, сумма которых делится на m=60. Среди всех таких пар нужно найти и вывести пару с максимальным произведением элементов. Если одинаковое максимальное произведение имеют несколько пар, можно вывести любую из них. Если подходящих пар в последовательности нет, нужно вывести два нуля.

Описание входных и выходных данных

В первой строке входных данных задаётся количество чисел N (2<=N<=10 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000

Пример входных данных:

8

10

30

50

40

60

70

90

80

Пример выходных данных для приведённого выше примера входных данных:

50 70

Пояснение. Из данных восьми чисел можно составить четыре пары, удовлетворяющие условию: (10 50) (30 90) (50 70) (40 80) Наибольшее произведение получается в паре (50 70)

Напишите эффективную по времени и по памяти программу для решения этой задачи.

Программа считается эффективной по времени, если при одновременном увеличении количества исходных чисел N и параметра m в k раз время работы программы увеличивается не более чем в k раз.

Сумма двух чисел кратна m если сумма остатков от деления этих чисел на m кратна m При этом для получения максимального произведения из чисел с одинаковыми остатками нужно выбирать наибольшее.

Будем хранить в массиве из m элементов максимальное число, имеющее соответствующий остаток от деления на m

Каждое введённое число будем рассматривать как правый элемент возможной пары, находить соответствующий ему парный остаток, вычислять произведение пары и при необходимости обновлять максимум для произведения и для чисел с данным остатком.


Задача 2 (скачать)

Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности, находящихся на расстоянии не меньше 6 (разница в индексах элементов должна быть 6 или более). Необходимо определить количество пар, разность чисел в которых кратна 3

Описание входных и выходных данных

В первой строке входных данных задаётся количество чисел N (6<=N<=1000). В каждой из последующих N строк записано одно натуральное число, не превышающее 1000

Пример входных данных:

8

2

6

5

4

6

7

9

8

Пример выходных данных для приведённого выше примера входных данных:

1

Пояснение. Из данных восьми чисел можно составить три пары, удовлетворяющие условию: (1 7) (1 8) (2 8) Для заданного набора чисел получаем пары (2 9) (2 8) (6 8) Разности чисел в этих парах равны 7 6 2 Одна из этих разностей кратна 3. Напишите эффективную по времени и по памяти программу для решения этой задачи. Программа считается эффективной по времени, если при одновременном увеличении количества исходных чисел N и параметра m в k раз время работы программы увеличивается не более чем в k раз.Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает 4 Кбайт и не увеличивается с ростом N

Для вычисления всегда используется первый элемент массива, а новое число записывается в последний. Хотя этот алгоритм работает медленнее, чем алгоритм с циклическим массивом (для каждого элемента требуется пять дополнительных присваиваний при сдвигах), основное требование эффективности здесь выполнено: при увеличении размера массива в k раз количество действий растёт не более чем в k раз. Для хранения счётчиков по остаткам можно вместо массива из трёх элементов использовать три отдельные переменные. Это делает программу чуть более громоздкой, но не влияет на эффективность.

Задача 3 (скачать)

1. Гоночная трасса состоит из двух основных дорог и нескольких переездов, позволяющих перейти с одной дороги на другую.

На всех участках, включая переезды, движение разрешено только в одну сторону, поэтому переезд возможен только с дороги A на дорогу B. Гонщик стартует в точке A0 и должен финишировать в точке BN. Он знает, за какое время сможет пройти каждый участок пути по каждой дороге, то есть время прохождения участков A0A1, A1A2, ..., AN-1AN, B0B1, B1B2, ..., BN-1BN. Время прохождения всех переездов A0B0, A1B1, ..., ANBN одинаково и известно гонщику. Необходимо определить, за какое минимальное время гонщик сможет пройти трассу.Напишите эффективную, в том числе по используемой памяти, программу для решения этой задачи. Перед текстом программы кратко опишите алгоритм решения и укажите язык программирования и его версию.

Входные данные

В первой строке задаётся количество участков трассы N. Во второй строке задаётся целое число t – время (в секундах) прохождения каждого из переездов A0B0, A1B1, …, ANBN. В каждой из последующих N строк записано два целых числа ai и bi, задающих время (в секундах) прохождения очередного участка на каждой из дорог. В первой из этих строк указывается время прохождения участков A0A1 и B0B1, во второй – A1A2 и B1B2 и т. д.

Пример входных данных

3

20

320 150

200 440

300 210

Выходные данные

Программа должна напечатать одно целое число: минимально возможное время прохождения трассы (в секундах).

Пример выходных данных для приведённого выше примера входных данных

750

Пусть Xi – минимально возможное время движения от A0 до Ai,

а Yi — минимально возможное время движения от A0 до Bi. В точку Ai можно попасть только из точки Ai-1, поэтому Xi = Xi-1 + ai. В точку Bi можно попасть двумя способами:

  • из точки Bi-1

  • из точки Ai.

Чтобы найти минимальное время, нужно вычислить время движения каждым из этих способов и выбрать из них минимальное.

Получается, что Yi = min(Yi-1 + bi, Xi + t).

Кроме того, очевидно, что X0 = 0, Y0 = t.

Используя эти соотношения, можно найти значения Xi и Yi для всех i от 1 до N, не сохраняя всех значений Значение YN будет окончательным ответом задачи.


Задача 4 (скачать)

Произведение ab кратно 7 и не кратно 49:

  • a кратно 7, но не кратно 49;

  • b не кратно 7(+ симметричный случай).

Максимальное произведение дают максимальные множители. Переменные

  • Max7 – максимальное число, кратное 7, но не кратное 49;

  • Max – максимальное число, не кратное 7.

X=Max7*Max


Задача 5 (скачать)

Дан список результатов сдачи экзамена учащимися школ некоторого района, с указанием фамилии и имени учащегося, номера школы и итогового балла. Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая определяет номера школ, имеющих наибольший средний балл, показанный выпускниками данной школы на экзамене. На вход программе в первой сроке подается количество учащихся во всех школах района N. В каждой из последующих N строк находится информация в следующем формате:<Фамилия> <Имя> <Номер школы> <Балл>

где <Фамилия> – строка, состоящая не более, чем из 20 символов без пробелов,<Имя> – строка, состоящая не более, чем из 20 символов без пробелов,<Номер школы> – число от 1 до 99,<Балл> - число от 0 до 100.Порядок следования строк – произвольный.

Пример входных данных:

6

Иванов Сергей 7 70

Сергеев Петр 3 65

Петров Кирилл 7 68

Кириллов Егор 3 75

Егоров Николай 7 71

Николаев Иван 19 70

Программа должна вывести номера школ, имеющих наибольший средний балл, показанный на экзамене выпускниками этой школы.

Пример вывода для приведенного выше примера ввода:

3

19

При выполнении задания следует учитывать, что значение N может быть велико (до 10 000).

Создадим два массива с индексами от 1 до 99, соответствующих номерам школ будем хранить в этих массивах :

  • количество выпускников из этой школы, сдававших экзамен

  • суммарный балл выпускников этой школы.

Программа читает все входные данные один раз. После считывания фамилии, имени, номера школы и балла считанное значение прибавляется к суммарному баллу для данной школы, а количество выпускников из этой школы, сдававших экзамен, увеличиваем на 1. После окончания считывания данных проходим циклом от 1 до 99 по всем школам и определяем максимальный средний балл по всем школам. Затем во втором цикле выводим номера школ, средний балл в которых равен максимальному.

Задача 6 (скачать)

На плоскости дан набор точек с целочисленными координатами. Необходимо найти треугольник наибольшей площади с вершинами в этих точках, одна из сторон которого лежит на оси OX. Напишите эффективную, в том числе по памяти, программу, которая будет решать эту задачу. Размер памяти, которую использует Ваша программа, не должен зависеть от длины переданной последовательности чисел. Укажите используемый язык программирования и его версию. В первой строке вводится одно целое положительное число – количество точек N. Каждая из следующих N строк содержит два целых числа – сначала координата х, затем координата у очередной точки.Программа должна вывести одно число – максимальную площадь треугольника, удовлетворяющего условиям задачи. Если такого треугольника не существует, программа должна вывести ноль.

Пример входных данных:

6

0 0

2 0

0 4

3 3

5 5

-6 -6

Пример выходных данных для приведенного выше примера входных данных:

6

Нам нужно определить площадь треугольника, одно из оснований которого лежит на оси ОХ. Пусть длина этого основания равна B, а высота треугольника равна H. Тогда площадь треугольника равна S = B×H/2. Из этих рассуждений следует, что треугольник с максимальной площадью образован двумя точками на оси ОХ, которые дальше всего стоят друг от друга, и точкой, которая наиболее удалена от оси ОХ, то есть имеет максимальную координату y (по модулю).

Таким образом, нужно найти:

  • xMin – минимальное значение x-координаты среди всех точек, для которых y-координата равна нулю;

  • xMax – максимальное значение x-координаты среди всех точек, для которых y-координата равна нулю;

  • yMax – максимальный модуль y-координаты среди всех точек.

Тогда S = (xMax – xMin)×yMax/2. Единственная сложность состоит в том, чтобы записать в переменные xMax и xMin некоторые начальные значения, которые позволят определить, что еще ни одной точки на оси ОХ не найдено.Например, можно записать в них два нуля, но как тогда различить ситуации «ни одна точка на оси ОХ не найдена» и «найдена одна точка на оси ОХ с координатой x=0»?

@akaVeta