Сбалансированное расположение n элементов в сетке - PullRequest
3 голосов
/ 19 мая 2010

У меня есть список из n логотипов для отображения в сетке, максимум 3 на строку.Какой алгоритм определяет, сколько отображать в строке, чтобы количество логотипов в строке было максимально сбалансировано без использования минимально возможного количества строк?

Например:

 n -> number in each row
 1 -> 1
 2 -> 2
 3 -> 3
 4 -> 2, 2
 5 -> 3, 2
 6 -> 3, 3
 7 -> 3, 2, 2
 8 -> 3, 3, 2
 9 -> 3, 3, 3
10 -> 3, 3, 2, 2

Ответы [ 4 ]

11 голосов
/ 19 мая 2010
  • Для N <= 3 просто используйте N. </li>
  • Если N точно делится на 3, тогда используйте: 3 3 ... 3
  • Если N при делении на 3 имеет остаток 1, тогда используйте: 3 3 ... 2 2
  • Если N при делении на 3 имеет остаток 2, тогда используйте: 3 3 ... 3 2
6 голосов
/ 19 мая 2010

КАК сбивает с толку ваш вопрос, я думаю, что вам нужно сначала определить:

number_of_rows = ceil(number_of_logos / 3.0)

Затем добавьте логотип в каждую строку, по одному за раз.

Python:

import math
def partition_logos(count, lsize):
    num_lines = int(math.ceil(count / float(lsize)))
    partition = [0] * num_lines
    for i in xrange(count):
        partition[i%num_lines] += 1
    return partition

>>> for i in xrange(1,11):
...     print partition_logos(i, 3)
[1]
[2]
[3]
[2, 2]
[3, 2]
[3, 3]
[3, 2, 2]
[3, 3, 2]
[3, 3, 3]
[3, 3, 2, 2]
1 голос
/ 19 мая 2010

Рекурсивное решение в Python:

def logos_by_row(N, rows):
    width = 0
    if N > 4 or N == 3:
        width = 3
    elif N == 4 or N == 2:
        width = 2
    elif N == 1:
        width = 1

    if width != 0:
        rows.append(width)
        logos_by_row(N - width, rows)


answer = []
for i in range(10):
    logos_by_row(i+1, answer)
print answer
1 голос
/ 19 мая 2010

просто используйте n / 3 для вычисления строки и n% 3 для вычисления столбца

edit: хорошо, я видел, как вы редактировали свой вопрос .... я не видел, что вы хотите отображать 2 в каждой строке, если 4 логотипа но тогда вы можете использовать n mod 3, чтобы вычислить, является ли это напоминанием, как уже предлагали другие

если n% 3 = 0, просто поместите 3 логотипа в каждой строке если n% 3 = 1, поместите последние 4 логотипа в две строки если n% 3 = 2, тогда поместите 3 логотипа в n строке, а последние 2 логотипа в отдельной строке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...