- •История изменений
- •Благодарности
- •Основы
- •Привет, Мир!
- •Ввод-вывод
- •Целые числа
- •Символы и строки
- •String
- •Перевод строки в целое число
- •Перевод целого числа в строку
- •Случайные числа
- •Профилирование
- •Массивы и матрицы
- •Объявление, размещение и инициализация массивов
- •Ввод массива
- •Вывод массива
- •Valarray
- •Vector
- •Матрицы
- •Элементарные алгоритмы
- •Абсолютное значение целого числа
- •Минимум и максимум среди двух чисел
- •Минимум и максимум среди трёх чисел
- •Сортировка массива из трёх чисел
- •Циклический сдвиг массива из трёх элементов
- •Разложение целого числа на его цифры
- •Линейный поиск
- •Рекурсия
- •Более сложные алгоритмы
- •Бинарный поиск
- •Циклический сдвиг массива
- •Подводные камни
- •Диграфы и триграфы
14 |
Симоненко Евгений А. Олимпиадная подготовка по программированию |
кую функцию, возвращающую случайное число из диапазона от a до b:
#include <cstdlib>
inline int rd(int a, int b) {
return a + rand() % (b - a + 1);
}
ПРОФИЛИРОВАНИЕ
Если решение задачи не проходит по “Time Limit” или имеется подозрение, что это может произойти, то есть смысл попытаться осуществить оптимизацию этого решения. Но прежде чем затевать эту самую оптимизацию следует сначала собрать информацию о времени исполнения отдельных участков кода решения, не следует доверять поиск участка кода для оптимизации, основываясь только на догадках. Практика показала, что зачастую произведённая оптимизация ничего не даёт, так как оптимизировать следовало другой участок кода, а вклад сопитимизированного участка ничтожен или несущественен.
Для сбора информации о времени исполнения участков кода можно использовать профилировщики. Например, профилировщик входит в состав Visual Studio в редакции Professional.
Если же профилировщика под рукой нет, то можно обойтись замером времени выполнения подозрительных участков кода. Для этого можно воспользоваться стандартными функциями библиотеки C time() за получения текущего времени в начале участка кода и в его конце и difftime() для вычисления затраченного на его выполнение времени в секундах. Ниже приведён образец использования этих функций:
time_t t_begin = time(NULL); // Участок кода.
time_t t_end = time(NULL);
cerr << difftime(t_end, t_begin) << endl;
Для получения достоверной информации в результате профилирования нужно иметь большие тесты.
