Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
[Вернуться к задаче]   1 2 3 4
  41  Егоров Илья Валерьевич, 21 апреля 2018 г. 0:31:40
     Кирилл, вот только как это избавит от сохранения всей строки (без использования ctypes)?
  42  Генералов Кирилл Витальевич, 20 апреля 2018 г. 12:05:00
     Илья, у меня появилась идея. Можно сделать подмассив, как срез, из 5 чисел (3 макс. и 2 мин.) и просто двигать его вправо посимвольно, тем самым ища нужные элементы, не взаимодействуя кучу раз со списком. Ну, к примеру, как ползунок на календаре будет работать, только из 5 ячеек.
  43  Егоров Илья Валерьевич, 11 апреля 2018 г. 14:56:05
     По-хорошему, видимо, не следует на Python сохранять всю строку (иначе упирается в память). На уме пока что 3 варианта: 1) Считывать посимвольно (хранить только 1 символ); 2) Считывать частями (своим буфером); 3) Считывать токенами. Представляю лишь реализацию через ctypes, но пока что TLE на 48
  44  Генералов Кирилл Витальевич, 10 апреля 2018 г. 18:47:43
     Да, Вы не ошиблись, именно .split(). Таким образом, нужно строку чисел посимвольно вбивать в список? Вручную,а не функцией?
  45  Егоров Илья Валерьевич, 08 апреля 2018 г. 12:17:29
     Кирилл, вы наверняка используете split, да? Так вот, по сравнению с просто считыванием всего файла (и дальнейшим использованием регулярок или посимвольной обработки) это сугубо в 2 раза больше потребляет память: как ни как, сначала считали строку, а затем разбили на подстроки, и всё это вынуждено храниться в памяти
  46  Генералов Кирилл Витальевич, 07 апреля 2018 г. 13:53:55
     Админ, что за веселье? :D. Вроде бы Питон и не может испытывать проблем из - за типов (int/int64), тогда почему у меня с 47 теста на 48 память прыгает с 2,5+-мб до 38мб. Что я делаю не так в этой жизни? Спасибо.
  47  Харченко Кирилл Константинович, 29 марта 2018 г. 21:41:32
     Одна из самых проблемных задач на сайте. Даже самая оптимизированная программа может не пройти по времени из-за загруженности системы. На личном компьютере результат равняется половины секунды, а здесь ставит 1.03 Но тем не менее, Accepted Ещё одна проблемная - задача №20 - Пилообразная последовательность.
     Попробуйте освоить чтение через fread, о котором говорит автор ниже. Зайдёт быстрее чем за десятую долю секунды. А вообще stdio.h + scanf("%d" хватает, чтобы сдать не совсем вплотную к ограничению по времени.
  48  Егоров Илья Валерьевич, 28 марта 2018 г. 17:34:53
     Комментарий к комментарию: Да, не идеальны. Тем не менее, статистика (не пара решений, а целое множество) обычно показывает действительность (колебание в пределах таких-то значений). У меня не одна !сотня! отправлений - ни одного 0.03. И всё оптимизируя да оптимизируя (уже почти некуда, подумываю об ассемблерных вставках), я улучшаю статистику. Раньше у меня, например, почти не было 0.062 - минимум 0.092. Теперь же 0.062 попадается значительно чаще
  49  Егоров Илья Валерьевич, 28 марта 2018 г. 17:13:11
     [продолжение] с оптимизацией 9) Если не уверены с выбором компилятора в тестирующей системе, опробуйте Visual C++. Ходят слухи, что он тут и жрёт меньше (доказано), и генерирует более эффективный код (под сомнением) 10) Указатели не панацея, бит'цы тоже. Их использование не ускорит магическим образом вашу программу: помните, что они могут сделать даже хуже; Эти рекомендации также годны для тех, кто не стремится выжать все соки, а у кого всего лишь с корректным алгоритмом не проходит по времени / памяти. Ну и добавочно для таких: 1) Если используете <iostream>, лучше всего отключить синхронизацию и автоматический flush, добавив эти 2 "магические строчки" в начало main: ios_base::sync_with_stdio(false); cin.tie(NULL); На данный момент мой рекорд для данной задачи - 0.062 сек. с 176 Кб потребления памяти при компиляторе Visual C++, но цель, ради которой я продолжаю оптимизацию, - 0.03; P.s. Да, я знаю, что лучшим решением тут считается кротчайшее решение, но мало ли кто тут бродит
     Замеры времени на acmp не идеальны, можете попробовать несколько раз сдать одно решение, может повезёт и 0.062 превратится в 0.03.
  50  Егоров Илья Валерьевич, 28 марта 2018 г. 17:12:47
     [продолжение], в собственной реализации парсинга). Причина: есть некий "модуль предсказания переходов", который, если не угадывает путь ветвления, отменяет инструкции, которые он заготовил для своей предсказанной версии, и загружает уже подходящие, на что тратит значительное (относительно) время. Замечание: см. пункт 7 6.1) Вычисление всяких == и т.п. не требует предсказателя (a == b, собственно, то же самое, что !(a ^ b)), так что этим можно воспользоваться для избавления от ветвления 7) Опираясь на пункт 0, замерять время работы после изменений (сугубо раз 7 хотя бы, т.к. из-за ветвления время получается разным: предсказатель то угадывает, то нет). Например, реализовав max через битовые операции, вы можете только ухудшить эффективность программы 7.1) Научитесь изучать получаемый ассемблерный код (хотя б на кол-во инструкций внимание обратите). Достаточно вбить в поисковик "compile explorer". Так вы можете провести достаточно тонкую оптимизацию 8) Вооружитесь const и static. Этим вы поможете компилятору
  51  Егоров Илья Валерьевич, 28 марта 2018 г. 17:11:40
     -Для гиков и не только- Как достичь наилучших результатов по времени и памяти на C++: 0) Тестировать у себя (этак при N = 10^7). Проще всего под unix, используя time 1) Алгоритм за O(n) 2) Достаточно хранить, как проспойлерили ранее, только 5 чисел из последовательности 3) fread/fgets (<stdio.h>) (да, он быстрее всяких getchar) со своим парсингом. Можно и _unlocked/_nolock версию. При этом надо подобрать оптимальный размер буфера (желательно равный 2 в некой степени) 3.1) Знание Великого ASCII поможет в создании быстрого парсинга 4) Реализация своего буферизированного вывода может ухудшить ситуацию, поэтому лучше воспользоваться старым-добрым (f)printf (тот же <stdio.h>) 5) Использовать int и, при необходимости, его аналоги фиксированного размера (int64 и т.п.), но не long long. Помните, что лучше максимум операций производить именно над int, так как меньшие типы в случае арифметических операций всё равно приводятся к int, да и в случае бОльших тоже не так всё радужно 6) Избегать ветвления (например
  52  Завгородний Михаил Сергеевич, 23 февраля 2018 г. 7:12:37
     Хорошая задача. Наконец-то ее решил
  53  Юсупов Темиржан Нурланович, 11 марта 2017 г. 9:24:24
     Библиотека <stdio.h> видимо работает быстрее всех остальных, попробуйте ее
  54  Давид Нигматуллин, 04 марта 2017 г. 11:15:44
     48 тест:
1) Замените лонги на инты там, где можно
2) Замените iostream (cin, cout) на stdio.h (scanf, printf)
1 пункт, лонги менять не нужно, так как в С++, long == int, а вот long long и __int64, да, где можно замените на int
  55  Давид Нигматуллин, 04 марта 2017 г. 11:14:06
     Либо можно не менять, используйте scanf, только первой библиотекой должна быть <stdio.h> а не cstdio или bits
  56  Кирилл Карнаухов, 18 января 2017 г. 7:56:31
     У кого падает решение за O(N) на 48 тесте, поменяйте компилятор на MV C++
  57  Васильев Алексей, 26 ноября 2016 г. 20:56:53
     48 тест:
1) Замените лонги на инты там, где можно
2) Замените iostream (cin, cout) на stdio.h (scanf, printf)
  58  Немцев Евгений Владимирович, 19 ноября 2016 г. 23:33:27
     Почему решение за O(N) валится с TL48 ? Это точно корректный тест??
  59  Слуцкий Алексей, 10 апреля 2016 г. 7:39:25
     Ограничения должны быть N < 1e7, чтобы сортировка не проходила, иначе эта задача вообще ничему не учит.
  60  Жавохир Мараимов, 03 января 2016 г. 6:47:22
     не с первого решал но оказался изи!!! Сначала найдете мах1, мах2, мах3, мин1, мин2;
потом max((max1*max2*max3),(min1*min2*max1));
 1 2 3 4

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru