![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Lacoste1024 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 20.3.2011 Репутация: нет Всего: 1 |
Решаю задачу. Ссылка на задачу. Пробую решить 2мя способами. 1й - перебор всех вариантов и сравнение + фильтр. 2й - бинарный поиск. 1й способ проходит 9 тестов (их содержание не знаю), а на 10й тестирующая программа говорит о превышении лимита времени. 2м способом решается только 2 теста, а на 3й выдаётся неправильный ответ. Что исправить? В каком направлении грести?
1й способ (перебор)
2й способ (бинарный поиск)
|
||||
|
|||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Не знаю, что у вас неправильно, но если память не жалко (а там дается 16мб, что веселит), то потратьте вы жалкие 64кб на массив типа bool.
Перый лист отметит true в существующих индексах, по прохождению второго списка, от 10000 отнимаем число и проверяем стоит ли true для этого индекса (если это не превышает 32767 разумеется) Смысл надеюсь поняли? Или вам конкретно хотелось бы узнать свои ошибки? Вот о чем я говорю, берет 256кб (видимо bool берет все же по 4 байта... очень подозрительно), проходить все тесты. Да, решение не оптимальное, но первое что пришло в голову, когда увидели 16мб
Это сообщение отредактировал(а) sQu1rr - 3.1.2012, 19:43 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
У Вас как минимум пропадают результаты вызовов bSearch в функции bSearch же.
В результате из bSearch возвращается неизвестно что. Нужно хотя бы
Добавлено через 2 минуты и 52 секунды И тонкий намёк: отсортированы оба массива (хотя, может, и так проскочит). От рекурсивной функции я бы отказался (хотя, опять же, и так сойдёт)))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Здесь вообще не нужен ни бинарный поиск, ни перебор всех вариантов. Задача решается за один проход. Даже более того, если бы это были 2 списка из разных файлов, то и память не нужна бы была. Здесь сложность что списки идут по очереди из stdin, и поэтому приходится запоминать 1 список в каком-то массиве. массив лучше брать не статический, так как полагать что максисальный размер будет неверно. По условию
он может быть и больше, так как элементы могут быть равны. например 1,1,1,1,1,2,2,2,2,2,3,3,3,3,3, и так до 50000 членов будет гораздо больше чем 50000, ваш статический массив переполнится и произойдет крах программы. Лучше всего заюзать что-нибудь из стл.
Повторюсь, если бы списки шли из разных файлов, то программа бы упростилась вообще до 2-3 строчек. |
||||||
|
|||||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Эээ, нет. Условие 1 <= Ni <= 50000 ставится именно на число элементов в списке, а не на значение элемента в списке. Последнее же выглядит как –32768 <= элемент <= 32767. Поэтому правильно (может, единичка лишняя, это не принципиально). Другое дело, что не всегда стоит доверять входным данным... А вот это как раз и есть следствие отсортированности двух массивов сразу Но дайте человеку самому дойти до истины -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
feodorv, да, действительно, немного не внимательно прочел условие, вы правы, Ну правилльно, то оно правильно, но стоит ли объяснять преимущества динамических массивов перед жестко заданным статическим массивом в 50001 элементов. Так что от стл отказываться не стоит даже в этом случае. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
В принципе, надо себя уже приучать к динамическим массивам. Просто в данном случае важнее само решение, нежели экономия стека. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Преимущество в экономии памяти, но скорость доступа к ячейке уменьшается в разы В таких алгоритмах важна скорость, тем более когда лимит памяти сверх нужного (16МБ) СТЛ нужно использовать везде по возможности, если от него что-то требуется (в моем примере стл ну просто лишний, например), что самому писать и лень и глупо да и не стоит, с этим соглашусь. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
sQu1rr, не в разы. При переходе с простых массивов на стл, скорость если и уменьшается, то на очень небольшие проценты. Чаще всего скорость вообще, не уменьшается, т.е. 1:1 Сказывается правильность библиотеки и оптимизация компилятора. Проверено неоднократно. |
|||
|
||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Нет, я ж не спорю, это смотря что выбрать, если вектор, то да, но, извините, чем он отличается от обычного массива, просто его местонахождение будет в стеке, что сыграет свою роль на скорости но настолько маленькую, что забудем. А под вы скорее имели ввиду чтото вроде std::set или map или даже лист сойдет. Так вот Если доступ к ячейке обычного массива или вектора константен O(1), то скорость доступа к set или map O(logn), заметьте я ничего не придумываю, это написано в документации, а найти нужный элемент в списке O(n) в худшем случает. Так вот. Значит при массиве в 50000 элементов каждый поиск будет стоит для мапа или сета будет стоить 15 операций, а список в худшем случае обойдется во все 50000. Используя вектор в стл получем константное время, но опять же, если использование ограничено созданием вектора и дуступе к его элементам, не вижу смысла в использовании стл, это стоит лишних заголовков и символов. Только для общего стиля, как говорится ) Кстати говоря в свете данной задачи мы говорим о разном, ведь используя ваше решение, стл действительно необходим и кроме преимуществ ничего отрицательного и не дает. Я же говорил об использовании в своем решении или решении автора Это сообщение отредактировал(а) sQu1rr - 4.1.2012, 03:59 |
|||
|
||||
| Lacoste1024 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 20.3.2011 Репутация: нет Всего: 1 |
Господа, я ещё маленький и не знаю стл((
sQu1rr, спасибо за решение. Оно прошло =) |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
sQu1rr,
Ну естественно. Выбор типа контейнера лежит на совести программиста. И скорость работы, при переходе на стл, не будет падать только при разумном выборе нужного контеейнера, а не абы как - любого, какой придет в голову. В данной задаче не нужен ни мэп, ни сет. я использовал дек, причем работа идет только к крайним элементам, что оптимизировано, для данного контейнера. sQu1rr, спор ни о чем. Я не критикую ваше решение, мне просто вчера захотелось решить эту задачку, вот и все. Не знаю даже почему. обычно здесь не очень интересные задачки, а здесь, вдруг захотелось Это разные решения. У вашего метода есть плюс - ему не нужен отсортированный список, но есть и минус, при расширении диапазона значений, решение станет невозможным, т.к. память начнет потребляться немеряно. |
|||
|
||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Согласен, я уже признал это в предыдущем сообщении, извиняюсь за невнимательность |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Вы хоть разобрались как оно работает? И почему так несправедливо проигнорировали лаконичное и изящное решение, предложенное volatile? Его стОит пристально изучить и переписать без использования stl, если stl вызывает затруднения. И поняли, что не так у Вас в решениях? В педагогических целях хочу обратить внимание на одну очень интересную конструкцию (я, лично, с таким встречаюсь в первый раз), присутствующую в первом решении автора топика:
Двойной break заставляет думать, что так автор хотел сразу выскочить из двойного цикла Это сообщение отредактировал(а) feodorv - 4.1.2012, 23:26 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Silent |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: нет Всего: 9 |
Вставлю еще свои "пять копеек".
На АСМовских контестах предлагается решить ряд задач (10) за определенное время (3 часа). Эта задачка считается очень легкой и должна быть решена за 5-10 минут, сразу и без намека на отладку. Решение, предложенное volatile хорошее, быстрое, но не слишком ли "ненадежное"? (В том плане, что можно по неаккуратности ляп допустить) Для других исходных данных (допустим, N<200000), действительно необходимо линейное решение. А здесь прокатывает и O(NlogN):
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |