ЗАДАЧА №766 Орешки
(Время: 1 сек. Память: 16 Мб Сложность: 3%)
Белочка собрала в лесу N шишек c орешками. Белочка очень привередливо выбирала шишки, и брала только те, в которых ровно M орешков. Также известно, что для пропитания зимой ей необходимо не менее K орешков. Определите, хватит ли на зиму орешков белочке.
Входные данные
Входной файл INPUT.TXT содержит три натуральных числа: N, M и K (N, M ≤ 100, K ≤ 10 000).
Выходные данные
В выходной файл OUTPUT.TXT выведите «YES» если белочке хватит орешков и «NO» в противном случае.
begin
var (n, m, k) := ReadInteger3;
Print(n * m >= k ? 'YES' : 'NO')
end.
Алгоритм здесь примитивный. Белочка отобрала N шишек, в каждой из которых М орешков. Осталось перемножить N и M и сравнить результат с потребностью в шишках K. Произведение не может превышать 100 х 100 = 10 000. Данные типа integer
позволяют работать с величинами до 2.1 млрд, так что проблем не ожидается.
ЗАДАЧА №819 Прямоугольный параллелепипед
(Время: 1 сек. Память: 16 Мб Сложность: 10%)
Прямоугольный параллелепипед - это объемная фигура, у которой шесть граней, и каждая из них является прямоугольником. Моделями прямоугольного параллелепипеда служат классная комната, кирпич, спичечная коробка. Длины трех ребер прямоугольного параллелепипеда, имеющих общий конец, называют его измерениями. На приведенном рисунке измерения представлены ребрами AB, BC и BF с общим концом в точке B, а значения измерений равны их длинам a, b и c соответственно.
По заданным измерениям прямоугольного параллелепипеда Вам необходимо определить площадь его поверхности и объем.
Входные данные
Единственная строка входного файла INPUT.TXT содержит разделенные пробелом три натуральных числа A, B и С – измерения параллелепипеда, каждое из измерений не превышает 106.
Выходные данные
В выходной файл OUTPUT.TXT выведите через пробел два целых числа: площадь поверхности и объем заданного параллелепипеда.
begin
var a, b, c: int64;
Read(a, b, c);
var s := 2 * (a * b + a * c + b * c);
Print(s, a * b * c)
end.
Еще одна задача с примитивным алгоритмом. Требуется знание формул площади поверхности (S) и объема (V) прямоугольного параллелепипеда:
$$S=2(ab+ac+bc); \quad V=abc$$
Небольшой подвох - диапазон представления данных. Куб от десяти в шестой степени - это десять в восемнадцатой, что выходит за диапазон представления данных типа integer
. Но все же попадает в диапазон для типа int64
. А Print идеально вписывается в выполнение требования о выводе через пробел.
ЗАДАЧА №10 Уравнение
(Время: 1 сек. Память: 16 Мб Сложность: 17%)
Вася в школе изучил квадратные уравнения и понял, как они легко решаются путем вычисления дискриминанта. Но Петя поведал ему о методе решения кубических уравнений вида Ax3 + Bx2 + Cx + D = 0. На факультативе по математике Васе задали решить около ста уравнений как раз такого вида. Но, к сожалению, Вася забыл формулы, о которых рассказывал ему Петя. Но Васе было известно, что все корни уравнений – целые числа и находятся на отрезке [-100, 100]. Поэтому у Васи есть шанс найти их методом перебора, но для этого ему придется затратить уйму времени, т.к. возможно необходимо будет осуществить перебор нескольких тысяч значений. Помогите Васе написать программу, которая поможет ему найти корни кубических уравнений!
Входные данные
В единственной строке входного файла INPUT.TXT записаны 4 числа: A, B, C и D – целые коэффициенты кубического уравнения. Каждый коэффициент по модулю меньше 32768, A ≠ 0.
Выходные данные
В единственную строку выходного файла OUTPUT.TXT нужно вывести через пробел в порядке возрастания все корни заданного кубического уравнения. Кратные корни следует выводить только один раз.
begin
var a, b, c, d: int64;
Readln(a, b, c, d);
for var x := -100 to 100 do
begin
var k := 0;
if d + x * (c + x * (b + a * x)) = 0 then
begin
k += 1;
Print(x);
if k = 3 then exit
end
end
end.
Не нужно поддаваться лукавой фразе “возможно необходимо будет осуществить перебор нескольких тысяч значений”. На интервале от -100 до 100 имеется ровно 201 целое число. Значение выражения Ax3 по абсолютной величине может достигать 32767х1003 = 32 767 000 000, что превышает границу 2.1 млрд. для данных типа integer
. Приходится использовать тип int64
. Значение левой части уравнения удобно вычислять по известной схеме Горнера для нахождения значений полиномов: D+x(C+x(B+Ax)). Это избавляет от непрятностей с вычислением значений степеней х.
Задача решается путем прямого перебора (“брутфорс” - brute force) всех возможных значений х. Поскольку кубическое уравнение может иметь максимум три действительных корня, при достижении счетчиком найденных корней k значения 3 цикл перебора прерывается. При переборе корней в направлении от -100 к 100 требования выводить корни в порядке возрастания и выводить кратные корни только один раз выполняются автоматически. Использование процедуры Print обеспечивает вывод данных через пробел.
ЗАДАЧА №760 Транспорт
(Время: 1 сек. Память: 16 Мб Сложность: 24%)
Все автовладельцы рано или поздно встречаются с инспекторами ГИБДД. Ваша задача состоит в том, чтобы рассчитать минимальное время прохождения автомобилем прямого участка дороги, на котором стоят инспекторы. Известно, что на данном участке инспекторы останавливают все проезжающие мимо автомобили. Примем следующие допущения: автомобили являются материальными точками, которые могут мгновенно останавливаться или набирать максимальную скорость. Автомобиль начинает свой путь в точке 0 и заканчивает его в точке L.
Входные данные
Первая строка входного файла INPUT.TXT содержит три числа: N – количество инспекторов (0 ≤ N ≤ 30), V – максимальная скорость автомобиля (км/ч) и L – длина участка дороги (км) (1 ≤ V, L ≤ 200). Вторая строка содержит N пар чисел xi – расстояние от точки 0 до инспектора (0 ≤ xi ≤ L) и ti – время (мин), на которое он останавливает машину (1 ≤ ti ≤ 10). Все инспектора стоят в разных точках. Все числа во входных данных целые.
Выходные данные
В выходной файл OUTPUT.TXT выведите время преодоления участка дороги автомобилем в минутах с точностью до двух знаков после запятой (вещественное число с ровно двумя цифрами после запятой).
begin
var n := ReadInteger;
var (V, L) := ReadlnReal2;
var (S, t) := (60 * L / V, 0);
loop n do
begin
var (p, ti) := ReadInteger2;
t += ti
end;
Write(S + t:0:2)
end.
И в этой задаче без подвоха не обошлось. Конечно, можно разбить путь на отрезки, зная координаты инспекторов, но зачем? Задана длина пути и постоянная скорость. Мгновенные остановки и разгоны, а также прямой участок дороги позволяют считать движение условно равномерным и прямолинейным на всем протяжении. Следовательно, суммарное время преодоленния всех участков может быть найдено как отношение пройденного пути к скорости движения. Для перевода времени в минуты нужно будет умножить его на 60. Остается учесть потери времени на остановки. Они равны сумме времени остановки на каждом участке. Находим эту сумму и прибавляем ее к времени движения. Переменная p в программе служит для считывания координат инспекторов, которые в расчете не участвуют. Поэтому предупреждающее сообщение компилятора о том, что переменная р получает значение, которое затем не используется нужно игнорировать. С диапазоном представления данных проблем нет, используем обычные integer
и real
.