Рассмотрим три группы A
, B
и C
каждая из которых содержит n
целые числа. Из этого мы можем сделать множество
S_n = {a * b + c | a in A, b in B, c in C}.
Учитывая n
, есть один или несколько минимальных размеров, S_n
которые зависят от того, какие наборы A,B and C
были выбраны.
Наборы могут содержать любые n
различные целые числа (положительные, нулевые или отрицательные). Нет необходимости, чтобы они были последовательными целыми числами или наборы были равны друг другу, например. A = {-1, 0, 5, 10, 27}, B = {2, 5, 6, 10, 14} and C = {-23, 2, 100, 1000,10000}
приемлемо (хотя и не очень хорошая идея), например.
задача
Задача состоит в том, чтобы написать код, чтобы найти наименьшее множество, которое S_n
он может для каждого n
из 1
от 20
.
Для каждого n
из 1
к 20
вашему коду должен выводиться выбранный A
, B
а C
вместе с результирующим размеромS_n
Гол
Ваша оценка будет суммой размеров, которые S_n
вы создаете. То есть это будет сумма из двадцати чисел.
Чем ниже оценка, тем лучше.
Примеры
Если A = B = C = {1, 2, 3, 4}
то, S_4 = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
который имеет размер19
.
Это, однако, никоим образом не является оптимальным. Например, A = B = C = {-1, 0, 1, 2}
дает, S_4 = {0, 1, 2, 3, 4, 5, 6, -1, -3, -2}
который имеет размер10
.
Задержки
Поскольку для проверки вывода мне потребуется запустить ваш код, убедитесь, что для его запуска на обычном рабочем столе требуется не более 30 минут и 4 ГБ ОЗУ.
Примечания
Ваш код должен на самом деле вычислить вывод. Вы не можете жестко закодировать предварительно вычисленные ответы в ваш код.
источник
Ответы:
Руст, оценка
14121411src/main.rs
Cargo.toml
Скомпилируйте и запустите
cargo run --release
.Выход
На моем ноутбуке это заняло около 8 минут и около 1,5 ГБ памяти.
Как это устроено
Мы предполагаем (без какого-либо конкретного обоснования), что A и B являются очевидным диапазоном последовательных целых чисел с центром в 0 или ½, затем выполняем поиск A * для оптимального C с учетом A и B .
источник
B
иC
можете ли вы сделать такой же поиск A *A
? Я думаю о некоем подходе координатного спуска. Исправьте все наборы, кроме одного, оптимизируйте последний и повторите.A = B
оба последовательных целых числа действительно всегда оптимальны. Только один встречный пример был бы захватывающим.Аксиома, оценка 1466
Наборы будут A = B = [- n / 2..n / 2], если n% 2 == 0, иначе A = B = [- n / 2 .. ((n / 2) +1)]
Множество C представляет собой сумму массива в виде [-2, -1, .. (n-2)] к одному массиву arr [] такого типа [0,0,0,0,0] или [0,1 , 1,1,2] или [0,0,0,0,3], чтобы массив имел свойство
Если вы хотите быть более точным или ваш компьютер работает быстрее, вы можете попытаться увеличить «3» на «inc (aix, 3)», что увеличит количество массивов для вариации набора C и, таким образом, увеличит точность результата.
В результате строка выводится
где B = A и | S | это номер элемента S
источник
SQL Server, 1495
Решение можно проверить здесь .
Извините за вывод в табличной форме.
источник
С, оценка
1448,1431Это был бы тот же самый +/- алгоритм реализации Аксиомы
Результаты
источник
Python 2 , оценка 1495
Попробуйте онлайн!
Простая базовая линия каждого набора - это интервал длины n с центром в 0, слегка несбалансированный для четного n. TIO имеет код Python для вычисления вашего счета.
Размер
(n*n+1)/2
для нечетного n и(n*n+n)/2
для четного n.источник
Mathematica, оценка 1495
источник
С ++, оценка 1411
Гипотеза A и B являются последовательными целыми числами с центром около 0, просто используйте имитированный отжиг, чтобы найти C.
Источник:
Результаты:
Если на моем компьютере установлена опция -O2, то для вычисления всех результатов потребуется 50 секунд.
источник