|
20 / 20 / 12
Регистрация: 16.01.2010
Сообщений: 66
|
||||||
нужна оптимизация приложения06.04.2012, 14:26. Показов 3164. Ответов 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
Оптимизация приложения Оптимизация приложения Оптимизация приложения Оптимизация приложения Оптимизация приложения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|