Дипломи#3969

Дипломи (Розбір)

Нехай — шуканий розмір сторони квадратної плати. Шукатимемо бінарним пошуком. Очевидно, що 0 < x \le max(w, h) \cdot n. Пошук почнемо на відрізку [a; b] = [0; max(w, h) \cdot n].

Нехай m = (a + b) / 2 — поточний розмір сторони плати. Оскільки диплом має розмір w \cdot h, то на ньому можна розмістити максимум (m / w) \cdot (m / h) дипломів. Якщо це число менше , то розмір плати недостатній, встановлюємо a = m + 1. Інакше зсуваємо праву межу пошуку: b = m.

Нехай розмір диплома w \times h = 2 \times 3.

Мінімальний розмір сторони плати, на якій можна розмістити дипломів, дорівнює .

Реалізація алгоритму

Читаємо вхідні дані.

scanf("%lld %lld %lld", &w, &h, &n);

Встановлюємо межі бінарного пошуку [a; b] = [0; max(w, h) \cdot n].

a = 0;
b = max(w, h) * n;

Запускаємо бінарний пошук.

while (a < b)
{
  m = (a + b) / 2;

Найбільша кількість дипломів розміру w \cdot h, яку можна розмістити на платі зі стороною , дорівнює dip = (m / w) \cdot (m / h).

  dip = (m / w) * (m / h);
  if (dip < n) a = m + 1;
  else b = m;
}

Виводимо відповідь.

printf("%lld\n", b);

Python реалізація

Читаємо вхідні дані.

w, h, n = map(int, input().split())

Встановлюємо межі бінарного пошуку [a; b] = [0; max(w, h) \cdot n].

a = 0
b = max(w, h) * n

Запускаємо бінарний пошук.

while a < b:
  m = (a + b) // 2

Найбільша кількість дипломів розміру w \cdot h, яку можна розмістити на платі зі стороною , дорівнює dip = (m / w) \cdot (m / h).

  dip = (m // w) * (m // h)
  if dip < n:
    a = m + 1
  else:
    b = m

Виводимо відповідь.

print(b)