|
20 / 20 / 12
Регистрация: 16.01.2010
Сообщений: 66
|
||||||
нужна оптимизация приложения06.04.2012, 14:26. Показов 3168. Ответов 39
Метки нет (Все метки)
Одной ночью коту Мурзику приснилось, что он судья на математических соревнованиях крыс. Соревнования проводятся среди N команд по K крыс в каждой. Соревнования проводятся в К раундов, в каждом из которых представитель команды называет число. Побеждает та команда, у которой произведение всех чисел наибольшее. Почему крысы не называют каждый раз максимально возможное число? На то они и крысы, что в отличии от Мурзика, обделены интеллектом. Но и Мурзик понимает, что сам подсчитать результат не сможет из-за недостачи математических способностей и поэтому просит вашей помощи.
Технические условия Входные данные Первая строка содержит два целых числа N и K (0 < N ≤ 20, 0 < K ≤ 100000). Следующие К строк содержат по N чисел, которые называют представители команд. Причем крысы, как представители образованного вида, знают только 32-битовые знаковые числа. Выходные данные Номер команды, выигравшей соревнования. Если несколько команд имеют одинаковые результаты, то побеждает та, у которой больше номер. Лимит времени: 2 секунды Лимит памяти: 64 MB вот решение:
на четырех тестах не хватает времени (2 сек). как решить эту проблему?
0
|
||||||
| 06.04.2012, 14:26 | |
|
Ответы с готовыми решениями:
39
Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация Нужна оптимизация Оптимизация приложения |
|
20 / 20 / 12
Регистрация: 16.01.2010
Сообщений: 66
|
|
| 06.04.2012, 18:17 [ТС] | |
|
0
|
|
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
||||||
| 06.04.2012, 18:26 | ||||||
0
|
||||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 06.04.2012, 18:29 | ||
|
0
|
||
|
Higher
|
|
| 06.04.2012, 19:08 | |
|
Ну там тема на длинную арифметику, так что придется ее написать.
Я за 2 минуты накидал решение с double, максимальное время работы - 0.6 секунд, но на 6 тестах валится где-то. Тут длинную арифметику нужно неплохо так реализовать, если хранить 9 знаков в одном элементе массива, то все равно будет не особо быстро. Вроде можно по 17-18 хранить, но тогда нужно будет контролировать переполнение через asm-вставки. Где-то читал про такое, но не уверен, что даже на ассемблере можно умножить 2 64битных числа.
0
|
|
|
20 / 20 / 12
Регистрация: 16.01.2010
Сообщений: 66
|
|
| 06.04.2012, 19:16 [ТС] | |
|
0
|
|
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
||||||
| 06.04.2012, 20:51 | ||||||
|
быдлокод :)
Процедурку умножения стырил, там по идее всё правильно должно быть.Добавлено через 49 минут С умножением что-то не так... Проверил - в конце выводит то, что задал в начале (пробовал другие числа любой длины кроме 1 начальным значением).
0
|
||||||
|
|
|
| 06.04.2012, 21:18 | |
|
Nekto, нужна оптимизация по скорости - не используй С++, используй Си.
Любой алгоритм на С++ можно переписать на Си, который будет выполняться быстрее. Классы, STL и т.д. и т.п. только замедляют выполнение программы.
0
|
|
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
| 06.04.2012, 21:19 | |
|
0
|
|
|
|
||||||||||||
| 06.04.2012, 22:45 | ||||||||||||
|
Да ладно вам, считайте приближённо, складывая только порядки величин.
Вот: как вам это? Не уверен, правда, что будет быстрее.
0
|
||||||||||||
|
|
|||||||
| 06.04.2012, 23:11 | |||||||
|
Как известно положительный int32 выглядит так
5=00000000000000000000000000000101 мы считаем нули сначала бит.маска mask=1<<30=01000000000000000000000000000 000 (старший бит - знак) мы двигаем маску вправо, чтобы определить порядок числа, пока не доберёмся до старшей единицы. cnt=2; mask=00000000000000000000000000000100 если видим, что следующий бит=0 (как в примере), то округляем число до 1<<mask=4, если бы число было 7=00000000000000000000000000000111, то округляем число до 1<<mask+1=8, Но значение чисел нам не важны и мы эту операцию (1<<mask=) даже не выполняем вместо этого мы суммируем в переменной result все показатели, т.к 2^n*2^m=2^(n+m) Как известно ОТРИЦАТЕЛЬНЫЙ int32 выглядит так -5=11111111111111111111111111111011 мы считаем нули сначала бит.маска mask=1<<30=01000000000000000000000000000 000 (старший бит - знак) мы двигаем маску вправо, чтобы определить порядок числа, но теперь наоборот: перебираем все единицы, пока не получим старший нуль Далее аналогично Добавлено через 5 минут Суммировать их порядки - идеальный вариант. Да, проблема - операция получения порядка числа, если кто знает более оптимальный вариант - отзовитесь. Возможно можно как-то вытащить порядок битовыми операциями c float
0
|
|||||||
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|||||||
| 07.04.2012, 02:30 | |||||||
|
нужна оптимизация приложения Так что, никто не знает, в чем ошибка? Посмотрите хотя бы первую функцию (mult). Она правильно должна работать?
Добавлено через 3 минуты Добавлено через 1 час 44 минуты Оптимизировал немного, нашел ошибку. Проходит 70% тестов. На одном неверный ответ, на остальных не хватает времени ![]()
0
|
|||||||
|
|
||
| 07.04.2012, 12:59 | ||
|
Обрати внимание: в задаче тебя не просят сказать, с каким конкретно счётом команда выиграла соревнования. Тебе нужно просто назвать победителя, а мой метод приближённого умножения, как раз позволяет это быстро оценить! Зачем изобретать методы длинного умножения? Зачем вычислять точно мантиссу произведения всех чисел, когда нам достаточно лишь знать порядок? Зачем эти пляски с векторами, которые только замедляют алгоритм? Ты точно понял суть моего предложения алгоритма?
0
|
||
|
Higher
|
||
| 07.04.2012, 13:07 | ||
|
Я попробовал набросать длинку на С, но жрется 106% времени все равно. Можно попробовать распараллелить вычисления, или хранить цифры в 64битном числе и умножать через asm-вставки. Еще вариант - можно слегка оптимизировать, если брать за основание не степень десятки, а степень двойки, тогда будет работать немного быстрее и есть меньше памяти, правда будет сложновато выводить такие числа, но в данной задаче это и не требуется. P.S. Nekto, имхо, плохая оптимизация, т.к. в худшем случае время только увеличиться.
0
|
||
|
|
||||||||||||
| 07.04.2012, 13:27 | ||||||||||||
|
Но вот о скорости надо думать в первую очередь. А значит, никакой длинной арифметики. К тому же в моём решении берётся не просто порядок старшего бита числа, а в зависимости от следующего за ним бита, округляется в ближайшую сторону, то есть в среднем ошибка накапливаться не должна. Я думаю, составитель задания хотел именно это проверить. А не то, что задачу можно перемножить в лоб длинной арифметикой. К тому же вектора - зло. Ты только представь, на сколько это
Присутствие нуля должно отменять весь подсчёт произведения и переходить к следующей команде.
0
|
||||||||||||
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|||
| 07.04.2012, 14:04 | |||
![]() Добавлено через 8 минут
0
|
|||
|
|
|||
| 07.04.2012, 14:29 | |||
|
1) Заменить деление на сдвиг, основание на степень двойки. 2) Использовать вместо вектора статический массив.
0
|
|||
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|||||||
| 07.04.2012, 14:40 | |||||||
0
|
|||||||
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
||||||
| 08.04.2012, 18:22 | ||||||
|
вот так проходит все тесты:
1
|
||||||
| 08.04.2012, 18:22 | |
|
Помогаю со студенческими работами здесь
40
Оптимизация приложения Оптимизация приложения Оптимизация приложения Оптимизация приложения Оптимизация приложения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|