|
|
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Приветствую всех знатоков :) Недавно увидел непростую задачу, знаний на которую пока что не хватает для решения. Сама задача: есть дорога, на которой стоит N заправок. Также известно расстоянием между заправками. Данные представлены в табличке с двумя колонками, где в первой - простая нумерация заправок от 1 до N, а во второй - расстояние до заправки (считать, что для первой заправки расстояние считается от начала отправления пользователя, например - из дома) Пример: 1 10 2 10 3 30 Нужно расположить на искомом отрезке L новых заправок так, чтобы минимизировать максимальное расстояние между соседними заправками. (например, на вышеупомянутом наборе данных, при количестве новых заправок L = 1 нужно поставить новую заправку ровно посередине дороги между 2ой и 3ей заправкой, а при количестве L = 2 новых заправок нужно поставить между 2ой и 3ей заправкой на расстоянии 1/3 и 2/3, то есть чтобы расстояние разбилось на три десятки, так как данное решение минимизирует максимальное расстояние между любыми соседними заправками) P.S. интересует решение без использования model, рекурсий, циклов, а также pl/sql, так как требованием было не использовать ранее сказанное, а также был дан намёк в сторону спецификации типов данных oracle. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 13:14 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666, У меня даже Яреклама выдаёт Тинькова в этой теме. В разделе "работа" уже разбирали эту задачу, но только через циклы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 13:24 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Dshedoo, К гадалке не ходи: в связи с ростом цен на бензин, Олег решил перейти с банковского бизнеса на розничную торговлю ГСМ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 13:30 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Dshedoo, как раз такие там и увидел данную задачу, но не увидел ни одного нормального алгоритма/решения. А ещё хотелось бы с теми ограничениями, что я написал, узнать, есть ли решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 14:26 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666есть ли решение.Если количество новоколонок меньше суммы целоотношений ненулевых расстояний, то решается в один проход. Иначе, решается перебором подмножеств количеством добавляемых колонок с выбором первого (минимального) макс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:10 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Можно попробовать симплекс-метод или ОПГ, мб проканает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:21 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666Пример: 1 10 2 10 3 30Если заправки находятся на одном отрезке, то непонятен смысл указывать те, что попадают в одну точку. Вторая заправка убирается группировкой, что никоим образом не влияет не итоговое решение. KDA_666Нужно расположить на искомом отрезке L новых заправок так, чтобы минимизировать максимальное расстояние между соседними заправками. (например, на вышеупомянутом наборе данных, при количестве новых заправок L = 1 нужно поставить новую заправку ровно посередине дороги между 2ой и 3ей заправкой, а при количестве L = 2 новых заправок нужно поставить между 2ой и 3ей заправкой на расстоянии 1/3 и 2/3, то есть чтобы расстояние разбилось на три десятки, так как данное решение минимизирует максимальное расстояние между любыми соседними заправками) Если разположить две новых между 2 и 3, то дистанции будут 10, 6.66, 6.66, 6.66. Если расположить одну между пользователем и 1/2, а вторую между 1/2 и 3, то дистанции будут 5, 5, 10, 10. Максимальное в обоих случаях 10. Отсюда вопрос почему нужно , а не можно . Алгоритм Сначала выполняется сорировка по расстоянию от текущей до предыдущей. На каждой итерации идем по увеличению расстояний, если расстояние между выделенными заправками на текущем участке равно максимальному, то добавляем новую на текущий участок. tmp_allocated использовано, так как после выделения изменится значение аграгатов для других строк на текущей итерации, а этого надо избежать. Поэтому max считаем по allocated, а не tmp_allocated. after_allocation, max_after_allocation - просто для информации, их можно убрать. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Неитеративно решается только при определенных ограничениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:44 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кобанчег, и вы предоставите(напишите) этот код на листочке во время собеседования ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:50 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Мои вопросы отпали. В условии сразу указывается расстояние между соседними, а не до исходной точки. Тогда не нужен подзапрос с lag. Алгоритм для модели не меняется. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 16:59 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кобанчег, KDA_666 интересует решение без использования model ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 17:01 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
123йй, При наличии доступа к компу времени надо не так уж и много - примерно полчаса. Но давать такое на собесед это неадекватно, имхо. Возможно, просто предполагался разговор о направлении решения и про специфические случаи. merch, Каюсь, в общем случае пока затрудняюсь решить неитеративно. Даже мышление в сторону "спецификации типов данных oracle" не помогает. Может это просто вброс ТС или собеседователей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 17:12 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кобанчег, Спасибо за ответ) Забыл в предложении "Данные представлены в табличке с двумя колонками, где в первой - простая нумерация заправок от 1 до N, а во второй - расстояние до заправки" явно указать "расстояние до СЛЕДУЮЩЕЙ заправки от предыдущей точки", что вносит дополнительное пояснение. Покапавшись в некоторых решениях и типах наткнулся на коллекции, с помощью которых можно решить данную задачу, не используя то, что я говорил в ограничениях (по типу model), но ни разу не работал с данным типом. Хотя основное направление я уже понял, был бы не против, если кто мог бы показать, как это примерно делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 17:16 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666Покапавшись в некоторых решениях и типах наткнулся на коллекции, с помощью которых можно решить данную задачу, не используя то, что я говорил в ограничениях (по типу model)Слишком унылый вброс который лишь демонстрирует полное непонимание вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2018, 17:45 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
KDA_666Приветствую всех знатоков :) P.S. интересует решение без использования model, рекурсий, циклов, а также pl/sql, так как требованием было не использовать ранее сказанное Странное ограничение. Отказавшись от использования самых подходящих инструментов вы получаете неэффективное решение. Это так работают в Тинькове? С этими ограничениями задачка превращается в головоломку. Впрочем - несложную, минут на 15 ( признаюсь честно, синтаксис модели я бы дольше вспоминал-гуглил, уж очень редко использую). Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. При &num_stations = 12: Заправка Расстояние3 104 8.3333333334 16.666666674 254 33.333333334 41.666666674 504 58.333333334 66.666666674 754 83.333333334 91.66666667 Если собеседующий скажет, что connect by level - это та же рекурсия, обойдитесь старым добрым джойном к select * from dba_objects. Решение, очевидно не самое эффективное - его сложность равна N * K * log(n*k) где N - количество заправок существующих, K - количество заправок которых надо добавить, но если и тех и тех не многие тысячи вполне рабочее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 01:01 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
ValergradПри &num_stations = 12При 13 и 14 макс расстояние остается 10 (между 1 и 2 ноль новых, между 2 и 3 - одна). При 15 расстояние между 1 и 2 по прежнему остается 10... при 20 по прежнему ничего между 1 и 2 не вставлено => max = 10. Если я правильно понимаю результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 02:19 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
КобанчегValergradПри &num_stations = 12При 13 и 14 макс расстояние остается 10 (между 1 и 2 ноль новых, между 2 и 3 - одна). При 15 расстояние между 1 и 2 по прежнему остается 10... при 20 по прежнему ничего между 1 и 2 не вставлено => max = 10. Если я правильно понимаю результат. Это была опечатка для проверки бдительности)). Нужно в одном месте не i+1, а i конечно же) авторThere are two hard things in computer science: 0) Cache invalidation 1) Naming things 2) Off-by-one errors Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Теперь для 15 результат: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 02:38 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
123ййКобанчег, и вы предоставите(напишите) этот код на листочке во время собеседования ? Я видел людей, которые могли это сделать. Несколько человек. Может быть именно их и ищут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 02:41 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
982183, Люди бывают разные. Раньше считалось нормой на asm писать на листочке. Но на собеседовании кодировать от получаса это перебор. Тут с согласен с Кобанчег 21704375 скорее это была теория и понять ход мысли ТС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 08:54 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Я к тому, что есть действительно уникумы, достаточно сложно тестируемые на обычных задачах. И если стоит задача найти именно таких. то выбор задания вполне обоснован. Хотя, несомненно, для общей массы сложность слишком нестандартно. Да и провернуть/проверить логику без теста на компе сложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 10:07 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
О чем вы, ребята? О каких уникумах? Задачка очень простая же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 12:24 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Valergrad, Изящно. Я вчера тоже стал думать в этом направлении, начал с вопроса: "сколько станций должно быть добавлено до первой станции на самом коротком отрезке (4)", но итоговую формулу для порядка выводить было лень. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 13:19 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
Кобанчег, А обратно отрезки в заправки развернуть?)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 13:28 |
|
||
|
Задача на собеседование
|
|||
|---|---|---|---|
|
#18+
SkilledJunior, Опять бензина с утра нюхнул? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2018, 13:44 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39717751&tid=1883283]: |
0ms |
get settings: |
8ms |
get forum list: |
30ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
375ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 725ms |

| 0 / 0 |
