План и Задачки кружка с 01.12.2010
Перебор.Теория.
- Полный перебор
- Отсечение по ответу: if (dep >= answer) return
- Отсечение по ответу с оценкой на остаток if (dep + F >= answer) return
- Отсечение "Динамика". if (мы уже были в этом состоянии) return
- Внешний перебор ответа.
- ищем путь минимальной длины = MinLen. Можно перебрать все пути, а можно только длины MinLen
- Для этого перебираем во внешнем цикле MinLen (т.е. ответ на задачу)
- Отсечение по времени =)
Перебор.Практика.
- Рекурсия на примере задачи про различные пути. [statement, problem A]
- Задача timus : 1152 (Зеркала). Отсечение по ответу.
- Задача про самый длинный простой путь [statement, problem B]
- Задача про StringDecomposition [statement, problem C]
Куда сдавать задачи?
- 1152 - на acm.timus.ru
- Все остальные в контест 101125_30 [statements]
- Пожалуйста, решайте задачи по порядку!
Язык Си
- clock(), CLOCKS_PER_SEC
- time(NULL)
Неолимпиадное программирование. Часть 1.
- Функции работы со временем: clock, time, asctime, localtime, rdtsc, GetTickCount [link]
- Функции работы с файловой системой: chdir, mkdir, ...
- Работа с консолью: GetStdHandle, SetConsoleTextAttribute, SetConsoleCursorPosition, SetConsoleCursorInfo [link]
- Перебор всех файлов в папке: _findfirst, _findnext, _findclose [link]
- Работа с потоками: CreateThread, передача параметров, "общение" с потоками
Задачки
- Создать дерево директорий "dir" → "dir\0", "dir\1", "dir\2". Глубина = 5.
- Пустить летать звездочку по экрану. Траектория = [sin(3t), cos(5t)]
- Вывести дерево директорий, начиная с текущей папки
Рекурсия, продолжение перебора.
- Найти максимум в массиве. Без циклов. Глубина рекурсии O(logN).
- Придумать 3 способа посимвольного вывода целых чисел. Вывести целое число посимвольно, рекурсивно.
- Найти замощение доминошками поля с дырками (тупо перебором). Раскрасить доминошки от 1 до 9.
- Теория: Дерево Отрезков, операции сверху
- Наибольшая возрастающая подпоследовательность деревом отрезков за O(NlogN).
Занятие 21-го января перед Региональным этапом
Условия задач: 2008-2009 day1 + 2008-2009 day2
Условия задач: 2009-2010 day1 + 2009-2010 day2
Условия задач: 2010-2011 day1 + 2010-2011 day2
Условия и дорешивание региональных олимпиад (2009, 2010, 2011) [link]
Тест к задаче details (13): [input] [output]
Тест к задаче numbers (47): [input] [output]
Решение задачи D с заочки: [code]
Фича языка С++ #1: while (n --> 0) { }
Фича языка С++ #2: x = (a, b);
Про STL и графы: программа на 24, 28 января
Задачи на разные темы, если вам скучно:
- Задача1: [link] Интересная задача. Решается за O(NlogN) деревом отрезков. Если вы Гуру, нужно решить за O(N).
- Задача2: 1238.Folding = Динамика (можно за O(n^3), accepted получает O(n^4))
- Задача3: 1152.Mirrors = Перебор (можно решить динамикой по подмножествам, но интереснее перебором)
Про vector
: [link] (Если вы плохо знакомы с графами, для вас задачи с тимуса: 1022 и 1080)
Про set
: [link]
Про map
: [link]
Упражнения и задачи на знание-понимание STL.Set:
- Отсортировать set-ом за O(NlogN) (сперва все insert-им, затем, пока не пусто вынимаем минимум). Протестить, что работает для N=2*106
- Дейкстра с кучей [link] (set - это куча).
Про Дейкстру почитать можно здесь [link1]
и здесь [link2]
- timus.1037 [link] (set - это куча)
Упражнения и задачи на знание-понимание STL.Map:
- Задача E "инкрементатор" [link] (map - это сила)
- Делители с регионалки (напишите перебор, который получат AC для 108, а затем соптимизьте его map-ом) [2010-2011 day2, задача 7]
Упражнения и задачи на знание-понимание STL.Vector:
- Details с регионалки (хранение графа как vector<int> []) [2009-2010 day2, задача 7]
- Если вы не уверены в своих знаниях графов, можно сперва сдать 2 простые задачи на тимусе:
[1080] (раскраска графа в 2 цвета) и
[1022] (топологическая сортировка)
Про STL, графы и дерево отрезков: программа на 07, 10 февраля
Про string
: [link]
Про pair
: [link]
Упражнения и задачи на знание-понимание string:
- Найдите число различных подстрок строки длины <= 100 с помощью
set
и string
. Какая у решения асимптотика времени работы?
- Найдите min циклический сдвиг строки за O(N^2)
- Более сложная задача: Disk-Tree [timus:1067]
- На подумать (только тем, кто сдал все остальное): [timus:1684]
Учебные задачи про графы:
- Простая [timus:1218]
- bfs [read about]
- bfs-01
- Ford-Bellman [read about]
- bfs-Ford-Bellman
- bfs-hard [timus:1325]
- Ford-Bellman - отрицательный цикл [timus:1162]
Задачи на отрезках и окружностях: 28 февраля, 3 марта
(28.02) Первый тест по C++ [link]
(03.03) Второй тест по C++ [link]
Задачки на отрезки и окружности [statements] and [contest]
Задачки на отрезках и окружностях, которые мы теперь умеем решать: [link]
Ford-Bellman: 10 марта, 14 марта
а) FB за O(VE)
б) FB с очередью за ~O(E)
в) Поиск отрицательного цикла за O(VE)
г) Поиск отрицательного цикла мин среднего веса за O(VElogMax)
*д) Поиск отрицательного цикла мин среднего веса за O(VE)
*е) MinCost flow (flow = k) (via FB)
*ж) MinCost circulation (flow = 0) (via negative cycle)
*пж) MinCost circulation за O((VE)^2)
Дорешивание: 17, 21 марта
(14.03) Третий тест по C++ [link]
(17.03) Четвертый тест по C++ [link]
28, 31 марта. Написание ИИ для крестиков-ноликов
(28.03) 5-й тест по C++ [link]
(28.03) Крестики-Нолики Доступны условия.
Спариловка под Win32 [link.7z] [link.rar]
4 апреля. Графы. Компоненты сильной связности
(04.04) Задачи на dfs
[link]. Решать нужно A, D, E
(04.04) Задачи на bfs
[link]. Решать нужно A, D
7-11 апреля. Дервья Отрезков
(11.04) Контест = 110326cb (Задачи на дерево отрезков)
Условия контеста (link)
(11.04) Решаем задачи E
, F
и G
(11.04) 6-й тест по C++ [link]
18-21 апреля. CMD/Bash.
(18.04) Задача brackets с ROI 2011. Тесты + условие + авторское решение = [link]
(21.04) Изучаем cmd. МНОГО примеров = [link]
(21.04) Список заданий:
Основное
- Сделать файл, в котором записаны числа от 5 до 25.
- Скомпилировать все cpp файлы.
- Написать cmd-файл, который замеряет время.
- Сгенерировать тесты 1..9 с 2-мя рандомными числами внутри
- Отдебажить на них баг в программе y.cpp (x.cpp и y.cpp всем даны).
- Стресс-тест (генератор прямо внутри cmd файла)
Дополнительное
- Посчитать факториал числа рекурсивной функцией
- Посчитать факториал числа без рекурсии, for-ом
25-28 апреля. Конец CMD + тестирование + генераторы
(25.04) random_shuffle за O(n). Руками писать не нужно, все есть в STL.
(25.04) Как сгенерировать граф?
(25.04) Как сгенерировать дерево? (p[v] = 0..v-1)
(25.04) Как сгенерировать случайное дерево? (применяем random_shuffle к вершинам, к ребрам)
(25.04) Основные способы тестирования:
- min тесты (главное, правильно прочитать условие и все разобрать)
- max тесты (главное, не полениться написать генератор = один цикл for)
- Крайние случаи - по желанию, зависит от вашей фантазии
- Stress тест на маленьких тестах
- Stress тест на больших тестах
- Перебор всех входных данных от и до
(25.04) Задача "проверка на простоту". Различные решения, самостоятельное тестирование.
- O(sqrtN)
- O(sqrtN / logN) для мультитеста
- Тест Ферма за O(k*sqrtN) (проверить на первых k простых числах малую теорему Ферма)
- Тест Миллера-Рабина (почитать можно тут [link])
- Смешной тест = Ферма + проверить маленькие делители.
- Как найти большое простое число? (100-значное)
(02.05) Почти программы на CMD
- Найти все исходники на cpp в данной папке, содержащие в своем имени букву "f"
- Найти все исходники на cpp в данной папке, содержащие слово "struct". Вывести первые N.
- В текущем cpp исходнике вывести все строки (с номерами), содержащие команды препроцессора.
- Вывести дерево директорий. С отступами.
- Вывести список всех некомпилирующихся/компилирующихся cpp файлов
(05.05, 12.05, 19.05) Python
Python 3.1.2 можно загрузить отсюда: [скачать!]
Примеры можно прочитать здесь [примеры]
help = [tutorial]
lists = [link]
print = [link]
Задачи. 10 штук.
Оцените сложность задач перед тем, как решать. Начинайте с легких ;-) [results]
Statements