Вы обучаете класс студентов интересным предпочтениям относительно того, как устроены их стулья. У них есть 3 очень специфических требования к расположению стульев:
Большинство из них расположены в прямоугольнике, даже если некоторые стулья пустуют.
Должно быть как можно меньше пустых стульев.
Они должны быть как можно более квадратными. Прямоугольность определяется расстоянием между шириной и высотой прямоугольника, чем ниже, тем лучше. Например, прямоугольник
4x7
имеет квадратность 3.
Чтобы быть более конкретным, «оценка» договоренности - это расстояние между шириной и высотой плюс количество стульев, которые опустели бы.
Давайте возьмем пример. Допустим, у вас 13 учеников. Вы можете расположить стулья любым из следующих способов:
1x13
2x7
3x5
4x4
1x13
не очень квадратный На самом деле, 1 и 13 разнесены на 12, поэтому мы даем этому расположению 12 баллов. У него также 0 пустых стульев, поэтому мы добавляем 0 баллов, что дает этому расположению 12 баллов. Не так уж и здорово.
2x7
конечно лучше. 2 и 7 разнесены только на 5, поэтому мы даем этому расположению 5 баллов. Однако, если вы на самом деле расположите 2 ряда по семь стульев, это займет 14 стульев, то есть один стул будет пустым. Таким образом, мы добавляем одно очко, давая этой договоренности оценку 6.
Мы могли бы также сделать 3x5
. 3 и 5 - 2, так что +2 балла. Это займет 15 стульев, то есть у нас будет два дополнительных стула, так что еще +2 балла, для оценки 4.
Последний вариант 4x4
. 4 и 4 - 0, поэтому мы даем это +0 баллов. 4x4 занимает 16 стульев, так что 3 стула пустуют, что дает общий балл 3. Это оптимальное решение.
В случае галстука оптимальным решением будет решение с менее пустыми стульями.
Соревнование
Вы должны написать программу или функцию, которая принимает целое число и выводит оптимальное расположение стульев для такого количества студентов. IO может быть в любом разумном формате. Вот пример вывода для любого количества студентов от 1 до 100:
1: (1, 1)
2: (1, 2)
3: (2, 2)
4: (2, 2)
5: (2, 3)
6: (2, 3)
7: (3, 3)
8: (3, 3)
9: (3, 3)
10: (2, 5)
11: (3, 4)
12: (3, 4)
13: (4, 4)
14: (4, 4)
15: (4, 4)
16: (4, 4)
17: (3, 6)
18: (3, 6)
19: (4, 5)
20: (4, 5)
21: (3, 7)
22: (5, 5)
23: (5, 5)
24: (5, 5)
25: (5, 5)
26: (4, 7)
27: (4, 7)
28: (4, 7)
29: (5, 6)
30: (5, 6)
31: (4, 8)
32: (4, 8)
33: (6, 6)
34: (6, 6)
35: (6, 6)
36: (6, 6)
37: (5, 8)
38: (5, 8)
39: (5, 8)
40: (5, 8)
41: (6, 7)
42: (6, 7)
43: (5, 9)
44: (5, 9)
45: (5, 9)
46: (7, 7)
47: (7, 7)
48: (7, 7)
49: (7, 7)
50: (5, 10)
51: (6, 9)
52: (6, 9)
53: (6, 9)
54: (6, 9)
55: (7, 8)
56: (7, 8)
57: (6, 10)
58: (6, 10)
59: (6, 10)
60: (6, 10)
61: (8, 8)
62: (8, 8)
63: (8, 8)
64: (8, 8)
65: (6, 11)
66: (6, 11)
67: (7, 10)
68: (7, 10)
69: (7, 10)
70: (7, 10)
71: (8, 9)
72: (8, 9)
73: (7, 11)
74: (7, 11)
75: (7, 11)
76: (7, 11)
77: (7, 11)
78: (9, 9)
79: (9, 9)
80: (9, 9)
81: (9, 9)
82: (7, 12)
83: (7, 12)
84: (7, 12)
85: (8, 11)
86: (8, 11)
87: (8, 11)
88: (8, 11)
89: (9, 10)
90: (9, 10)
91: (7, 13)
92: (8, 12)
93: (8, 12)
94: (8, 12)
95: (8, 12)
96: (8, 12)
97: (10, 10)
98: (10, 10)
99: (10, 10)
100: (10, 10)
Как обычно, это код-гольф, поэтому применяются стандартные лазейки, и победитель - самый короткий ответ в байтах.