Задача
Какое минимальное количество спичек необходимо для того, чтобы выложить на плоскости [latex]n[/latex] квадратов со стороной в одну спичку? Спички нельзя ломать и класть друг на друга. Вершинами квадратов должны быть точки, где сходятся концы спичек, а сторонами – сами спички.
Напишите программу, которая по количеству квадратов [latex]n[/latex], которое необходимо составить, находит минимальное необходимое для этого количество спичек.
Входные данные
Одно целое число [latex]n[/latex] [latex](1 ≤ n ≤ 10^9)[/latex].
Выходные данные
Вывести минимальное количество спичек, требуемых для составления [latex]n[/latex] квадратов.
Тесты
Входные данные | Выходные данные |
[latex]1[/latex] | [latex]4[/latex] |
[latex]2[/latex] | [latex]7[/latex] |
[latex]4[/latex] | [latex]12[/latex] |
[latex]7[/latex] | [latex]20[/latex] |
[latex]150[/latex] | [latex]325[/latex] |
[latex]10000[/latex] | [latex]20200[/latex] |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> #include <cmath> using namespace std; int main() { long long n, k; long double length, width; cin >> n; length = floor(sqrt(n)); width = ceil(n/length); k = 2*n + length + width; cout << k << endl; return 0; } |
Решение задачи
Один квадрат можно составить из [latex]4[/latex] спичек. Два квадрата — из [latex]7[/latex] спичек. Очевидно, что квадраты следует располагать так, чтобы они образовывали прямоугольник, “близкий” к квадрату.
Например, на рисунке 1 мы использовали меньшее количество спичек, чем на рисунке 2, хотя количество квадратов одинаковое:
Зададим размеры прямоугольника. Пусть [latex]width = \sqrt n[/latex] — его ширина. Округлим значение [latex]width[/latex] к наибольшему целому числу, не превышающему данное. Тогда его длина будет [latex]length = \frac {n} {width}[/latex]. Если округлить значение [latex]length[/latex] к наибольшему целому числу, не превышающему данное, то мы сможем построить лишь те квадраты, которые входят в наш прямоугольник. Округляя же значение [latex]length[/latex] к наименьшему целому числу, которое не меньше данного, мы сможем достроить квадраты, не поместившиеся в наш прямоугольник.
Если отложить вниз количество спичек, равное [latex]width[/latex], и вправо — [latex]length[/latex], получается следующий рисунок (разумеется, количество отложенных спичек меняется в зависимости от [latex]n[/latex]):
Очевидно, что достроить треубемые квадраты можно, положив «уголки» из двух спичек, начиная с левого верхнего угла и двигаясь сверху вниз и слева направо.
«Уголок»:
Отсюда и получается формула: [latex]k = 2 \cdot n + length + width [/latex], где [latex]k[/latex] — количество спичек, требуемое в задаче.
Ссылки
Условие задачи на e-olymp
Код решения
Хорошо. Хотя математики и физики (в отличие от программистов) не любят длинные названия переменных. Обычно математики ограничиваются в формулах одной буквой для переменной.
+10 за DIY SVG. Это ценный опыт.
Спасибо, учту на будущее