Соревнование
Есть N городов, выровненных по прямой. I-й город расположенA[i]
километрах справа от происхождения. Нет двух городов будет в одном месте.
Вы собираетесь построить электрическую сеть с некоторыми электростанциями. Электростанции должны быть построены внутри города. Однако вам разрешено только строить K
(<N) электростанции, поэтому в некоторых городах не будет электростанций. Для каждого города без электростанций вы должны проложить кабель между ним и ближайшим городом, в котором есть электростанция .
Например, если есть три города 0, 1, 2
, и только в городе 0
есть электростанция, вам необходимо проложить два кабеля: один от 2
до 0
(2 км), а другой от 1
до 0
(1 км), общая длина которых составляет 3 км. ,
Учитывая K
и расположение городов ( A
), вы должны рассчитать минимальные километры кабеля, необходимые для построения сетки.
Примеры тестовых случаев
K = 1, A = [0, 2, 4, 6, 8] : 12
# build power plant in the city at position 4, total length = 4 + 2 + 0 + 2 + 4 = 12
K = 3, A = [0, 1, 10, 11, 20, 21, 22, 30, 32] : 23
# build power plants in cities at positions 0, 10 and 22
K = 5, A = [0, 1, 3, 6, 8, 11, 14] : 3
# build power plants in all cities except those at positions 0, 3
K = 6, A = [0, 1, 3, 6, 8, 14, 15, 18, 29, 30, 38, 41, 45, 46, 49, 58, 66, 72, 83, 84] : 49
Характеристики
Вы должны реализовать функцию или программу, которая принимает положительное целое число
K
и список целых чиселA
в любой форме и выводит / возвращает целое число, представляющее ответ.A
сортируется в порядке возрастания, и все элементы являются неотрицательными целыми числами.A[0] = 0
иA[N-1]
будет не более 1000н.Обратите внимание, что выходные данные будут иметь величину 1000N 2 , поэтому в больших случаях вам могут понадобиться 64-битные целые числа в некоторых языках.
Многопоточность не допускается (я буду устанавливать сродство вашей программы только 1 ядро при оценке). Оптимизация компилятора (например,
-O2
в C) разрешена.
счет
Я рассчитываю ваш код на моем компьютере (Ubuntu 16.04 с процессором Intel i7-3770S) с разными размерами тестовых случаев. В частности, я сгенерирую несколько тестовых случаев с N = floor (2 x / 5 ), где x - положительное целое число.
Ваша оценка будет значением x самого маленького тестового случая, когда ваша программа использует более 10 секунд или 1 ГБ памяти или не дает правильного ответа.- Ответ с наибольшим количеством очков выигрывает. Если два ответа получают одинаковую оценку, побеждает более ранний ответ.
Все программы будут оцениваться по одному и тому же набору тестовых примеров.
Не стесняйтесь отправлять свои собственные оценки. Пояснения к вашему алгоритму приветствуются.
бонус
Это моя программа на C ++, она набирает 108 баллов . Вы можете проверить дайджест SHA-2569a87fa183bad1e3a83d2df326682598796a216b3a4262c32f71dfb06df12935d
по всему сегменту кода (без нижнего колонтитула) в ссылке.
Алгоритм объединяет бинарный поиск и оптимизацию Кнута, чтобы найти правильное наказание для каждого растения, чтобы получить желаемое число. Сложность O (N log N log A [N-1]). Я был удивлен, что программа получила более высокий балл, чем решение O (N log A [N-1]) от Anders Kaseorg . Вероятно, это связано с тем, что журнал регистрации в оптимизации Кнута обычно не происходит.
Обратите внимание, что этот вызов такой же, как в IOI 2000 Post Office . Однако исходные ограничения: N <= 300 и K <= 30.
источник
2^^(x/5)
: в чем смысл? Вы можете просто указать верхнюю границу для N?N=21( = floor(2^(22/5)) )
10 секунд, но не может обработатьN=24( = floor(2^(23/5)) )
, то 23 будет счет. Я не использовал верхнюю границу, поскольку различия между разными алгоритмами слишком велики. Например, если я установлю N <= 40, между ними будет небольшая разница,O(KN^2)
иO(KN^3)
, тем не менееO(2^N)
, даже не закончится в разумный срок.Ответы:
Руст , оценка = 104
Это реализация алгоритма, отмеченного Grønlund et al. (2017) в конце §3.3.1, хотя я должен был следовать длинной цепочке цитирования и заполнить некоторые недостающие детали. Это работает в O ( N log A [ N - 1]).
Компилировать с
rustc -O
. Формат ввода находитсяK
в первой строке, за которой следуют записиA
, по одной записи в строке, все в stdin.(Примечание: я отправляю это через час после крайнего срока вознаграждения, но я ожидаю, что последняя версия, которую я представил до истечения крайнего срока вознаграждения , которая проходила за O ( N log N log A [ N - 1]), наберет около 94 .)
Попробуйте онлайн!
Ржавчина , предварительная оценка = 73
Компилировать с
rustc -O
. Формат ввода находитсяK
в первой строке, за которой следуют записиA
, по одной записи в строке, все в stdin.Попробуйте онлайн!
источник
61
, но это из-за переполненияu32
. Может быть, вы можете перейти на 64-битный целочисленный тип?type Cost = u32
наtype Cost = u64
?73
.С, балл = 56
содержание
a.c
:сценарий оболочки для компиляции и тестирования выше:
n = 776 занимает 6,2 с, n = 891 - 12 сn = 1176 занимает 5,9 с, n = 1351 занимает чуть более 10 сn = 1351 занимает 8,7 с, n = 1552 занимает более 10 с (с k = 2 * n / 3) на моем
Intel(R) Core(TM) i3-2375M CPU @ 1.50GHz
источник
syntax/c.vim
.C ++, оценка = 53
Решение, которое я сказал в комментарии.
O(n²×k)
, (теперь я удалил его, потому что он больше не нужен) Возможно, можно уменьшить доO(n×k)
.Ввод довольно гибкий, в первой строке первое число
k
, остальные числа являются элементами массиваa
, но если он встречает закрывающие скобки, он прекращает чтение ввода. Таким образом, ввод, какK = 1, A = [0, 2, 4, 6, 8] : 12
принято.Попробуйте онлайн!
Генерация случайных тестовых случаев.( по умолчанию ввод
N
и диапазон города1000×N
)источник
int
s наint64_t
s.C #, оценка = 23
Я уверен, что это не выиграет этот вызов, я просто хотел опубликовать первый (и очень простой) ответ, чтобы побудить других людей опубликовать свои алгоритмы и улучшить мой. Этот код должен быть скомпилирован как консольный проект, использующий пакет Combinatorics от NuGet. Основной метод содержит несколько вызовов
Build
метода для проверки предложенных случаев.Действительно простое объяснение: для каждой комбинации
c
изk
элементовa
, вычислить сумму расстояний от каждого элементаa
до ближайшего элементаc
и возвращает комбинацию с наименьшим суммарным расстоянием.Однострочная версия
Build
метода (возможно, медленнее, чем оригинальная, расширенная версия; для этого необходимо добавить ссылку наSystem.Linq
):источник
C ++, оценка = 48
Использование ввода: NKA [1] A [2] ... A [N]
источник
step
до 70, то ваш предварительный счет равен 60.Рубин , оценка = 23
Попробуйте онлайн!
Я не думаю, что это победит, но я хотел попробовать.
источник
JavaScript (ES6) (Node.js) , оценка = 10
Новый алгоритм, объяснит, работает ли он на этот раз.
Попробуйте онлайн!
Запускать так же, как другой.
JavaScript (ES6) (Node.js) , оценка до тестирования = 12
Схема алгоритма:
Программа сначала отображает Данные в Городской класс, который отображает несколько точек данных:
Затем массив добавляется в класс Group, который имеет следующее:
Теперь алгоритм приступает к разделению групп до тех пор, пока он имеет 2 или более электростанций для размещения.
Наконец, он отображает группы в свои центры и суммирует их все.
Как запустить:
Запустите с использованием Node.js (v9.2.0 - это то, что использовалось для создания)
запуск программы с использованием сгенерированных тестов для оценки 70:
Запущена программа с использованием 1 электростанции и города [0,3,5]:
Код:
Попробуйте онлайн!
Я зачищу закомментированный код в течение следующих нескольких дней, так как я все еще работаю над этим, просто хотел посмотреть, проходит ли это больше, чем просто небольшие случаи.
источник
K = 2, A = [0, 21, 31, 45, 49, 54]
. Правильный ответ - 40, но ваша программа выдает 51.K = 2, A = [0, 4, 7, 9, 10]
. Исправьте: 7, ваш ответ: 8.K = 2, A = [0, 1, 3, 4, 9]
. Правильно: 6, ваш ответ: 7.C (неконкурентный, предварительный балл = 76)
Это попытка перевести второе решение Rust @ AndersKaseorg в C.
Компилировать с:
источник
Чисто , оценка = 65
Компилировать с:
clm -h 1024M -gci 32M -gcf 32 -s 32M -t -nci -ou -fusion -dynamics -IL Platform main
Принимает
K
, а затем каждый элементA
, как аргументы командной строки.источник