Кондитерской
фабрике нужны коробки для шоколада, которые необходимо сделать из картонных
листов размером axa. Коробка должна быть открытой сверху и
иметь квадратное основание. Коробка формируется в два этапа. На первом шаге
квадратные кусочки размера bxb вырезаются из углов картонного листа.
На втором шаге прямоугольные части сгибаются на 90 градусов внутрь коробки. По
длине стороны картонного листа a
необходимо найти такую высоту b
коробки, для которой ее объем будет максимальным.
Вход. Первая строка содержит количество тестов n (1 ≤ n ≤ 10). Каждая из следующих n строк является отдельным тестом и содержит одно действительное
число – длину стороны картонного листа a (1
≤ a ≤ 1014).
Выход. Вывести n строк, каждая из которых содержит
оптимальную высоту b для
соответствующего теста, округленная до 10 знаков после запятой.
Пример
входа |
Пример
выхода |
1 34.0 |
5.6666666667 |
математика
Длина основания
коробки равна a – 2b. Площадь основания коробки равна (a – 2b)2
, а ее объем (a – 2b)2 * b.
Найдем максимум функции f(b) = (a – 2b)2 * b.
f’(b) = 2(a – 2b) * (-2) * b
+ (a – 2b)2 = 0. Корень a
= 2b нам не подходит, так как коробка
в таком случае будет вырожденная. Имеем: -4b
+ a – 2b = 0, a = 6b, b
= a / 6.
То есть при b = a
/ 6 объем коробки будет наибольшим.
Реализация алгоритма
Для каждолго
теста читаем значение a и выводим a / 6.
scanf("%d",&n);
for(i = 0; i < n; i++)
{
scanf("%lf",&a);
printf("%.10lf\n",a/6);
}
Java реализация
Реализация через
сканер. Во входных данных символ перевода на новую строку ('\n') кодируется
одним байтом 0A как в Линуксе.
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int n = con.nextInt();
con.useLocale(new Locale("US"));
for(int i = 0; i < n; i++)
{
double a = con.nextDouble();
System.out.format(Locale.US,"%.10f\n",a/6);
}
}
}
Реализация через
BufferedReader.
import java.util.*;
import java.io.*;
public class Main
{
public static void main(String[] args)
throws Exception
{
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine());
for(int i = 0; i < n; i++)
{
double a = Double.parseDouble(in.readLine());
System.out.format(Locale.US,"%.10f\n",a/6);
}
}
}