7612. Алекс и квадраты оригами

 

Алекс любит оригами – японское искусство складывания из бумаги. Большинство конструкций оригами начинаются с квадратного листа бумаги. Алекс собирается сделать подарок для своей матери. Подарочная конструкция требует три одинаковых квадратных листа бумаги, но у Алекса имеется только один прямоугольный лист. Он может из него вырезать квадраты, стороны которых должны быть параллельны сторонам листа. Помогите Алексу определить максимально возможный размер квадратов, который он способен вырезать.

 

Вход. В одной строке два целых числа h и w (1 ≤ h, w ≤ 1000) – высота и ширина куска бумаги.

 

Выход. Выведите одно действительное число – наибольшую длину стороны квадратов. Всегда можно вырезать три одинаковых квадрата из листа бумаги размером h × w так, чтобы их стороны были параллельны сторонам листа.

Ответ следует вывести с точностью не меньше трех десятичных знаков.

 

Пример входа 1

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

210 297

105.0

 

 

Пример входа 2

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

250 100

83.33333333333333

 

 

РЕШЕНИЕ

математика

 

Анализ алгоритма

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

 

1 Случай. Длина стороны квадрата равна h / 2:

 

2 Случай. Если w < 3h, то длина стороны квадрата равна w / 3:

 

3 Случай. Если w ≥ 3h, то длина стороны квадрата равна h:

 

Остается среди трех случаев выбрать максимально возможную длину стороны квадрата.

При w ≥ 3h первый и третий случаи можно объединить: длина стороны квадрата равна

max(h / 2, h) = h

При w < 3h объединяем первый и второй случаи: длина стороны квадрата равна

max(h / 2, w / 3)

 

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

Читаем входные данные. Нормализуем прямоугольник так, чтобы ширина w была не меньше высоты h.

 

scanf("%lf %lf",&w,&h);

if (w < h)

  temp = w, w = h, h = temp;

 

if (w >= 3*h) res = h;

else res = max(h/2, w/3);

printf("%.3lf\n",res);

 

Java реализация

 

import java.util.*;

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    double w = con.nextDouble();

    double h = con.nextDouble();

    if (w < h)

    {

      double temp = w;

      w = h;

      h = temp;

    }

    double res;

    if (w >= 3*h) res = h;

    else res = Math.max(h/2, w/3);

   

    System.out.printf("%.3f\n",res);     

  }

}

 

Python реализация

 

w, h = map(float, input().split())

 

if w < h:

  w, h = h, w

 

if w >= 3 * h:

  res = h

else:

  res = max(h / 2, w / 3)

 

print(res)