Задание нужно обязательно решить бинарным поиском. Не проходит тест 7, входные не известны. Что я не учел?

Рейтинг: -1Ответов: 1Опубликовано: 01.03.2023

Когда Петя учился в школе, он часто участвовал в олимпиадах по информатике, математике и физике. Так как он был достаточно способным мальчиком и усердно учился, то на многих из этих олимпиад он получал дипломы. К окончанию школы у него накопилось n дипломов, причём, как оказалось, все они имели одинаковые размеры: w — в ширину и h — в высоту. Сейчас Петя учится в одном из лучших российских университетов и живёт в общежитии со своими одногруппниками. Он решил украсить свою комнату, повесив на одну из стен свои дипломы за школьные олимпиады. Так как к бетонной стене прикрепить дипломы достаточно трудно, то он решил купить специальную доску из пробкового дерева, чтобы прикрепить её к стене, а к ней — дипломы. Для того чтобы эта конструкция выглядела более красиво, Петя хочет, чтобы доска была квадратной и занимала как можно меньше места на стене. Каждый диплом должен быть размещён строго в прямоугольнике размером w на h. Дипломы запрещается поворачивать на 90 градусов. Прямоугольники, соответствующие различным дипломам, не должны иметь общих внутренних точек. Требуется написать программу, которая вычислит минимальный размер стороны доски, которая потребуется Пете для размещения всех своих дипломов. Формат ввода Входной файл содержит три целых числа: w, h, n (1 ≤ w, h, n ≤ 109).

Формат вывода В выходной файл необходимо вывести ответ на поставленную задачу.

Пример Ввод Вывод 2 3 10 9

  w,h,n=str(input()).split()
w=int(w)
h=int(h)
n=int(n)
l=0
r=max(w,h)*n    
while r-l>0:
    m=(l+r)//2
    if m//h*m//w>=n:
        r=m
    else:
        l=m+1
print(r)

Ответы

▲ 1
if m//h*m//w>=n:

Проблема в это строке. У операций умножения и деления одинаковый приоритет, поэтому они выполняются слева направо.

Рассмотрим пример: Сколько в квадрат 10x10 (m=10) можно поместить прямоугольников 3х3 (h=3, w=3)? По логике 3*3 = 9, но данная формула даст: 10//3*10//3 = ((10//3)*10)//3 = (3*10)//3 = 30//3 = 10.

Если мы скобками расставим приоритет и сначала вычислим размер количество по вертикали и горизонтали, и только потом перемножим, то получим правильный ответ:

if (m//h)*(m//w)>=n: