Усовершенствовать решение задачи "Выбор зала" - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Написала код к этой задаче, но он не проходит половину тестов по времени. (Ссылка на сторонний ресурс удалена)

Выбор зала

Имя входного файла: hall.in Имя выходного файла: hall.out Ограничение по времени: 1 секунда Ограничение по памяти: 256 мегабайт Для проведения церемонии открытия олимпиады по информатике организаторы осуществляют поиск подходящего зала. Зал должен иметь форму прямоугольника, длина каждой из сторон которого является целым положительным числом. Чтобы все участники церемонии поместились в зале, и при этом он не выглядел слишком пустым, площадь зала должна находиться в пределах от A до B квадратных метров, включительно. Чтобы разместить на стенах зала плакаты, рассказывающие об успехах школьников на олимпиадах, но при этом не создать ощущения, что успехов слишком мало, периметр зала должен находиться в пределах от C до D метров, включительно. Прежде чем сделать окончательный выбор, организаторы олимпиады решили просмотреть по одному залу каждого подходящего размера. Залы с размерами Y × Z и Z × Y считаются одинаковыми. Чтобы понять необходимый объем работ по просмотру залов организаторы задались вопросом, сколько различных залов удовлетворяют приведенным выше ограничениям. Требуется написать программу, которая по заданным A, B, C и D определяет количество различных залов, площадь которых находится в пределах от A до B, а периметр — от C до D, включительно.

Формат входного файла

Входной файл содержит четыре разделенных пробелами целых числа: A, B, C и D (1 ≤ A ≤ B ≤ 109, 4 ≤ C ≤ D ≤ 109).

Формат выходного файла

Выходной файл должен содержать одно число — искомое количество залов.

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

hall.in hall.out
2 10 4 8 3

Пояснения к примеру

В примере ограничениям удовлетворяют залы следующих размеров: 1 × 2, 1 × 3, 2 × 2.
Program Hall1;
Var a,b,c,d,s,x,y,k:longint;f1,f2:text;
Begin
assign(f1,'Hall.in');
reset(f1);
readln(f1,a,b,c,d);
close(f1);
k:=0;
for x:=1 to trunc(sqrt(b)) do
 for y:=x to b do
  if (x*y>=a) and (x*y<=b) then
   if (2*(x+y)>=c) and (2*(x+y)<=d) then k:=k+1;
assign(f2,'Hall.out');
rewrite(f2);
writeln(f2,k);
readln;
close(f2);
End.
Можно ли что-то с этим сделать? Заранее спасибо за Ваши ответы.

Решение задачи: «Усовершенствовать решение задачи "Выбор зала"»

textual
Листинг программы
for x:=1 to round(sqrt(b)) do
  begin
    1) для x оценим YminS и YmaxS по ограничениям для площади
    2) для текущего x оценим YminP и YmaxP по ограничениям для периметра
    3) Ymin:=max(YminS, YminP); Ymax:=min(YmaxS, YmaxP)
    4) по Ymin и Ymax оценим количество возможных вариантов для текущего x
  end;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5
Похожие ответы