Олимпиадные задачи по программированию: что за зверь? / Блог компании ABBYY / Хабр
что за зверь? / Блог компании ABBYY / Хабр
Недавно мы анонсировали конкурс задач по спортивному программированию. Организаторы конкурса попросили написать короткое объявление о конкурсе в блог ABBYY, но строгий редактор отказался печатать анонс без объяснения того, что же такое олимпиадная задача. Из этого родилась целая статья. Начнем, пожалуй, с примера олимпиадной задачи.
Этот же пример, чтобы по ссылке не ходить
ИТ-рестораны
ограничение по времени на тест: 4 секунды
ограничение по памяти на тест: 256 мегабайт
ввод: standard input
вывод: standard output
В городе N. очень плохо с дорогами, общепитом и IT-инфраструктурой. Всего в городе n перекрестков, некоторые пары которых соединены двусторонними дорогами. Дорожная сеть состоит из n - 1 дороги, по дорогам можно добраться с любого перекрестка на любой другой. Да, вы правы — дорожная сеть образует неориентированное дерево.
Недавно мэр города придумал способ, устраняющий проблемы с общепитом и IT-инфраструктурой, причем одновременно! Решено поставить на перекрестках города ресторанчики двух известных сетей кафе для IT-шников: «iMac D0naldz» и «Burger Bing». Так как владельцы сетей не дружат, категорически запрещается размещать рестораны двух разных сетей на соседних перекрестках. Есть и другие требования. Вот полный список:
- в каждом перекрестке должен находится не более чем один ресторан;
- каждый ресторан принадлежит либо «iMac D0naldz», либо «Burger Bing»;
- каждая сеть должна построить не менее одного ресторана;
- не существует пары перекрестков, которые соединены дорогой и на которых стоят рестораны разных сетей.
Мэр собирается брать неплохой налог с каждого ресторана, поэтому он заинтересован в том, чтобы общее число ресторанов было максимальным.
Помогите мэру проанализировать ситуацию. Найдите все такие пары (a, b), что a ресторанов может принадлежать «iMac D0naldz», b — «Burger Bing», а сумма a + b максимальна.
Входные данные
В первой строке входных данных содержится целое число n (3 ≤ n ≤ 5000) — количество перекрестков в городе. Далее в n - 1 строке перечислены все дороги, по одной дороге в строке. Каждая дорога задана парой чисел xi, yi (1 ≤ xi, yi ≤ n) — номерами соединяемых перекрестков. Считайте, что перекрестки пронумерованы от 1 до n.
Гарантируется, что заданная дорожная сеть представляет собой неориентированное дерево с n вершинами.
Выходные данные
В первую строку выведите целое число z — количество искомых пар. Далее выведите все искомые пары (a, b) в порядке увеличения первой компоненты a.
Примеры тестовВходные данные
5
1 2
2 3
3 4
4 5
Выходные данные
3
1 3
2 2
3 1
Входные данные
10
1 2
2 3
3 4
5 6
6 7
7 4
8 9
9 10
10 4
Выходные данные
6
1 8
2 7
3 6
6 3
7 2
8 1
Первое, что бросается в глаза, это необычное условие. Такой подход сложился исторически: писать краткую математическую формулировку не принято. Обычно ее пытаются связать с реальной жизнью, ну или с не очень реальной. Например, в USACO героями всех задач являются фермер Джон и коровы. Прежде чем приступить к решению после прочтения условия, участнику требуется выделить математическую формулировку задачи.
Решением олимпиадной задачи является программа, написанная на одном из языков программирования. Самыми популярными языками являются: C++, C#, Java, Pascal. Возможно, вы скажете, что Pascal уже давно устарел. Однако не стоит его недооценивать! Опытные спортивные программисты способны писать на Pascal’е стандартные алгоритмы, которые уже есть в C++, быстрее, чем обычный человек прочтет условие задачи 🙂 Кстати, из-за того, что участники выбирают язык программирования самостоятельно, есть риск, что они делают неоптимальный выбор. Во-первых, решения существуют не на всех языках, а во-вторых, решения, написанные на некоторых языках, могут работать менее эффективно, чем на других.
Вернемся к обсуждению условия. Олимпиадные задачи очень формализованы:
- строгий формат ввода\вывода, иногда даже с точностью до пробелов и переводов строк;
- условия, как правило, имеют строгую однозначную трактовку. Вот уж где можно поучиться заказчикам в написании ТЗ!
- строгие ограничения по времени выполнения и используемой памяти. В реальной разработке вам скорее скажут что-то в стиле «хотим, чтобы работало на таком-то железе и на такой-то ОС» или «слушай, твоя программа ест слишком много памяти». Куда реже можно услышать фразы типа «твоя программа должна работать не более 1,5 секунд» или «не смей использовать более 64 мегабайт памяти»;
- все исходные величины строго ограничены.
Такая строгая формализация является оправданной. Все решения участников соревнований проверяются на некотором наборе тестов, который готовится жюри олимпиады и обычно заранее не известен участникам.
Следующая особенность заключается в анализе задач. Автор олимпиадной задачи думает о том, сколько процентов участников решит такую задачу, за какое время (с точностью до минут), к какой тематике относится данная задача (например, задача на графы или задача на жадный алгоритм).
Вообще существует два типа олимпиадных задач: «классические» и «эвристические». Классические задачи предполагают наличие точного строго доказанного решения. При решении эвристических задач участники соревнуются между собой, кто сможет получить лучшие ответы. Например, чье решение правильно распознает большее количество символов. Эвристические задачи обычно не имеют точных решений. Здесь они более всего близки к реальной разработке. Например, распознавание символов – вполне себе «эвристическая» задача.
Существует немало способов оценки решений для «классических» задач:
- задача считается решенной, если решение участника правильно сработало на всех тестах. Такая система оценки используется на ACM-соревнованиях.
- за решение начисляются баллы, которые зависят от количества тестов, успешно пройденных программой. Такой подход часто используется на школьных олимпиадах: никто не уйдет обиженным с соревнования и получит хотя бы свои 0,5 балла.
- тесты объединены в группы, за каждую из которых начисляется определенное количество баллов. Нужно заметить, что баллы за группу начисляются, только если решение правильно сработало на всех тестах из группы. Это разумный компромисс между справедливостью и удовлетворением участников. ABBYY Cup исповедует именно такую форму оценки решений;
- иногда число баллов, полученных участником, зависит от времени, которое было затрачено на решение задачи. Например, такая система используется на Codeforces и Topcoder.
Оценки решений «эвристических» задач в каждом случае разрабатывается индивидуально. В эвристической задаче, которую предлагалось решить финалистам ABBYY Cup 2.0, нужно было разработать программу для классификации документов по тематикам. Решение проверялось на группе тестов, каждая из которых содержала некоторый набор текстов на разные темы. Всего было три тематики, и каждая из них была представлена в каждой группе в разном количестве. Выигрывал тот, чье решение прошло наибольшее количество групп тестов. При установке «эвристической» задачи на тестирующую платформу иногда приходиться ее дорабатывать, поскольку большинство тестирующих платформ «заточено» на оценку классических задач.
Конечно, говорить об особенностях олимпиадных задач можно бесконечно. Мы осветили лишь самые главные моменты. Если у вас есть вопросы или комментарии – добро пожаловать в комментарии. А если вы умеете и любите сочинять задачи, описанные в статье, мы можем поговорить об этом здесь.
Владимир Миняйлов, департамент технологий NLC,
Рузана Миниахметова, группа образовательных проектов.
Разбор задачи с Международной олимпиады по информатике IOI 2016 / Хабр
В августе этого года в Казани прошла Международная олимпиада по программированию для школьников — IOI 2016. Российская команда стала второй в общем зачете.
Один из серебряных медалистов, Денис Солонков из г. Мытищи, сделал разбор задачи «Обнаружение молекул», которая предлагалась участникам олимпиады.
Денис Солонков — многократный победитель Всероссийских олимпиад по программированию и Moscow CTF School, выпускник Школы программистов, ныне студент ВШЭ.
Являясь одним из преподавателей Дениса, я попросил его сделать разбор задачи с IOI 2016.
Условие задачи
Петр работает в компании, которая создала прибор для обнаружения молекул. Каждая молекула имеет целый положительный вес. Прибор характеризуется интервалом обнаружения [l, u], где l и u целые положительные числа. Прибор может обнаружить множество молекул тогда и только тогда, когда это множество содержит такое подмножество, что суммарный вес молекул в нем принадлежит интервалу обнаружения прибора.Смотреть полностьюБолее формально, рассмотрим n молекул с весами w0,…,wn−1. Обнаружение считается успешным, если существует множество различных индексов I = {i1,…, im} такое, что l ≤ wi1 +…+ wim ≤ u.
В силу особенностей работы прибора разница между l и u гарантированно больше либо равна разнице весов между самой тяжелой и самой легкой молекулами. Более формально, u − l ≥ wmax − wmin, где wmax = max(w0 ,…,wn−1) и wmin = min(w0 ,…,wn−1).
Требуется написать программу, которая либо находит любое подмножество молекул с суммарным весом, принадлежащим интервалу обнаружения прибора, либо определяет, что такого подмножества не существует.
Детали реализации
Вам следует реализовать одну функцию (метод):
int[] solve(int l, int u, int[] w)
- l и u: границы интервала обнаружения,
- w: веса молекул.
Если требуемое подмножество существует, то функция должна вернуть массив индексов молекул, которые формируют любое такое подмножество. Если существует несколько правильных ответов, верните любой из них.
Если требуемого подмножества не существует, то функция должна вернуть пустой массив.
Для языка программирования Си сигнатура функции немного отличается:
int solve(int l, int u, int[] w, int n, int[] result)
n: количество элементов в w (то есть число молекул),
остальные параметры такие же, как описано выше.
Вместо того, чтобы возвращать массив состоящий из m индексов (как указано выше), функция должна записать индексы в первые m ячеек массива result и затем вернуть m.
Если требуемого подмножества не существует, то функция должна вернуть 0, не записывая ничего в массив result.
Ваша программа может записывать индексы в возвращаемый массив (или в массив result для языка Си) в любом порядке.
Пожалуйста, используйте предоставленные шаблоны файлов для уточнения реализации на выбранном вами языке программирования.
Примеры
Пример 1
solve(15, 17, [6, 8, 8, 7])
В этом примере есть четыре молекулы с весами 6, 8, 8 и 7. Прибор может обнаружить подмножества молекул с суммарным весом от 15 до 17 включительно. Обратите внимание, что 17 − 15 ≥ 8 − 6. Суммарный вес молекул 1 и 3 равен w1 + w3 = 8 + 7 = 15, таким образом функция может вернуть [1, 3]. Другие возможные правильные ответы: [1, 2] (w1 + w3 = 8 + 8 = 16) и [2, 3] (w1 + w3 = 8 + 7 = 15).
Пример 2
solve(14, 15, [5, 5, 6, 6])
В этом примере есть четыре молекулы с весами 5, 5, 6 и 6. Требуется найти подмножество с суммарным весом от 14 до 15 включительно. Опять же, обратите внимание, что 15 − 14 ≥ 6 − 5. Для данного примера не существует подмножества молекул с суммарным весом от 14 до 15, соответственно функция должна вернуть пустой массив.
Пример 3
solve(10, 20, [15, 17, 16, 18])
В этом примере есть четыре молекулы с весами 15, 17, 16 и 18. Требуется найти подмножество с суммарным весом от 10 до 20 включительно. Вновь, обратите внимание, что 20 − 10 ≥ 18 − 15. Любое подмножество, состоящее из одного элемента, имеет вес от 10 до 20, соответственно возможные правильные ответы это [0], [1], [2] и [3].
Система оценивания
(9 баллов): 1 ≤ n ≤ 100, 1 ≤ wi ≤ 100, 1 ≤ u, l ≤ 1000, все wi равны.
(10 баллов): 1 ≤ n ≤ 100, 1 ≤ wi, u, l ≤ 1000, и max(w0 ,…, wn−1) − min(w0,…, wn−1 ) ≤ 1.
(12 баллов): 1 ≤ n ≤ 100 и 1 ≤ wi,u, l ≤ 1000.
(15 баллов): 1 ≤ n ≤ 10 000 и 1 ≤ wi, u, l ≤ 10 000.
(23 балла): 1 ≤ n ≤ 10 000 и 1 ≤ wi, u, l ≤ 500 000.
(31 балл): 1 ≤ n ≤ 200000 и 1 ≤ wi, u, l < 231.
Пример проверяющего модуля
Проверяющий модуль получает данные в следующем формате:
- Строка 1: целые числа n, l, u.
- Строка 2: n целых чисел: w0,…, wn−1.
Решение от Дениса
Задача уже неплохо формализована. Нам нужно выбрать подпоследовательность чисел из массива w длины n, так, чтобы их сумма лежала в отрезке [l, u]. Также, присутствует странное условие: u − l ≥ wmax − wmin (1).
Оно явно играет роль в решении задачи, иначе его бы просто не было. Попытаемся понять, что оно нам дает.
Пусть мы выбрали подпоследовательность элементов с суммой = S и S < l. В таком случае, если мы заменим один из элементов подпоследовательности на какой-то другой, не выбранный нами, то новая сумма S’ ≤ u. Случай, увеличивающий сумму на максимально возможное число, это замена минимального на максимальный элемент, а согласно условию u − l wmax ≥ wmin.
Вооружившись этим фактом, перейдем непосредственно к решению. Для начала отсортируем массив w, чтобы с ним было удобней работать. Разобьем нашу задачу на два пункта.
- Определить L — количество элементов в правильном ответе, или сказать, что его не существует.
- Найти L элементов, сумма которых лежит в [l, u]
Сначала разберемся во вторым пунктом. Пусть мы знаем, что ответ существует и в нем содержится L элементов. Возьмем первые L элементов отсортированного w. Их сумма точно ≤ u, так как мы условились, что ответ существует. Теперь выполним следующий алгоритм.
Если текущая сумма больше или равна нижней границы, завершить работу алгоритма
Заменить минимальный элемент из нашей выборки на максимальный из ещё не не выбранных. В случае, если такая замена не увеличивает сумму, то завершить работу алгоритма не проводя её.
Заметим, что благодаря (1) мы никогда не пересечем верхнюю границу. Почему этот алгоритм точно найдет ответ? Предположим обратное.
В каждой итерации алгоритм меняет минимальный элемент нашей выборки на максимальный из не выбранных. Если такой элемент меньше нашего, то это значит, что мы выбрали L последних элементов w. Если сумма L максимальных элементов меньше l, значит подходящей подпоследовательности длины L не существует, однако мы условились об обратном. Противоречие.
Подобный алгоритм можно быстро реализовать, используя встроенную в С++ реализацию сбалансированного дерева поиска: set. Количество итераций алгоритма в худшем случае: n, асимптотика подобного решения будет O(n log n).
Вернемся к первому этапу решения нашей задачи, а именно в поиске подходящего L. Мы можем просто проверить каждый из них и получить асимптотику O(n2 log n), но это будет слишком долго работать.
Давайте найдем такую длину i, что сумма первых i элементов больше u. Если такой длины не существует, то будем полагать, что i = n + 1 Из всех таких возьмем минимальную. Я утверждаю, что если правильный ответ существует, то он будет содержать i − 1 элемент. Конечно, могут существовать и другие варианты ответа, но один из них будет содержать в себе такое количество элементов. Докажем это утверждение.
Пусть L = i − 1, или L = n, если i не существует. Сумма первых L элементов ≤ u, так как L < i. Запустим описанный выше алгоритм поиска подпоследовательности. Если он найдет ответ, то наше утверждение верно. В ином случае, сумма последних L элементов < l. Тогда ответа также не существует для любой длины, меньшей чем L. Просто потому что было взято L максимальных, так что любое количество меньше тоже будет меньше l. Ответа также не существует для всех длин больше L, так как сумма первых i элементов больше, чем u. Значит, ответа вовсе не существует.
Итого, мы можем найти необходимую длину за O(n), и найти ответ по длине за O(n log n). Значит, время работы всего алгоритма будет O(n log n), что спокойно набирает 100 баллов.
Исходный код решения
#include <algorithm>
#include <vector>
#include <set>
#include «molecules.h» //Including grader file
using ll = long long; //A little alias to save time.
using namespace std;
vector<int> find_subset(int l, int u, vector<int> w) {
int n = w.size();
vector<pair<int, int> > weight(n);
for (int i = 0; i < n; i++) {
weight[i] = { w[i], i }; //Storing initial index for the output.
}
sort(weight.begin(), weight.end());
ll cur_sum = 0;
int bad_i;
for (bad_i = 0; bad_i < n; bad_i++) { //Locating first bad length
cur_sum += weight[bad_i].first;
if (cur_sum > u)
break;
}
if (bad_i == 0) //no solution
{
return vector<int>();
}
set<pair<int, int> > picked, remain;
ll curpicked = 0;
for (int i = 0; i < bad_i; i++) {
picked.insert(weight[i]);
curpicked += weight[i].first;
}
for (int i = bad_i; i < n; i++) {
remain.insert(weight[i]);
}
while (curpicked < l && !remain.empty()) {
if (picked.begin()->first >= remain.rbegin()->first) //Nothing left to swap
break;
//Swap the lowest and the highest elements.
curpicked += remain.rbegin()->first — picked.begin()->first;
auto el1 = *picked.begin();
auto el2 = *remain.rbegin();
picked.erase(el1);
picked.insert(el2);
remain.erase(el2);
}
if (curpicked < l){ //no solution
return vector<int>();
}
vector<int> answer;
for (auto el : picked)
answer.push_back(el.second);
return answer;
}
Решение подобных задач требует серьезной подготовки, которую можно получить в Школе программистов. В этом году ШП открывает новое отделение – в Физтехпарке, IT-парке рядом с МФТИ. Программа обучения усложненная, такая же, как в отделении при Яндексе, включающая в себя изучение высокоуровневых и низкоуровневых языков, дискретную математику, алгоритмику, структуры данных, сети, ОС и прочее.
Набор на 2016/17 учебный год проводится для школьников 6–10 классов по результатам экзамена, который состоится 8 октября 2016 в 14:00. Зарегистрироваться на экзамен и пройти подготовительный онлайн-курс можно здесь.
В Школе программистов также есть Онлайн отделение. Уроки проходят в формате вебинаров, принимаются студенты со всей России, начиная с 13 лет. Ближайший вступительный экзамен пройдет 15 октября в 17:00. Зарегистрироваться на экзамен в Школу программистов Онлайн и пройти подготовительный курс можно здесь.
Олимпиадные задачи по информатике с решениями
В этом разделе будут размещаться олимпиадные задачи по
информатике с решениями за прошлые годы. Многие олимпиадные
задачи давались без названий, таким задачам я сам дам название.
Задачи буду размещать либо с полным условием задач на этой
странице, либо с частью условия, чтобы вам было проще
сориентироваться в поиске решения нужной задачи.
Наибольшее отношение. Найдите наибольшее
значение отношения трехзначного числа к сумме его цифр.
Решение
задачи>>
Вычисление суммы цифр строки. Дана строка,
состоящая из символов, каждый из которых является знаком «+» или
цифрой, начинающаяся и заканчивающаяся цифрой. Если в строке
встречается сочетание «++», то выдать сообщение об ошибке, в
противном случае вычислить получившуюся сумму.
Решение задачи>>
Острова. Каждый элемент квадратной матрицы
размеренности N x N равен нулю, либо единице. Найдите количество
«островов», образованных единицами. Под «островом» понимается
группа единиц (либо одна единица), со всех сторон окруженная
нулями (или краями матрицы). Единицы относятся к одному
«острову», если из одной из них можно перейти к другой
«наступая» на единицы, расположенные в соседних клетках.
Соседними являются клетки, граничащие по горизонтали или
вертикали.
Решение задачи>>
Черно-белая графика. Одна из базовых задач
компьютерной графики – обработка черно-белых изображений.
Изображения можно представить в виде прямоугольников шириной w и
высотой h, разбитых на w×h единичных квадратов, каждый из
которых имеет либо белый, либо черный цвет. Такие единичные
квадраты называются пикселями. В памяти компьютера сами
изображения хранятся в виде прямоугольных таблиц, содержащих
нули и единицы.
Полное условие и решение задачи>>
Клавиатура. Всем известно, что со временем
клавиатура изнашивается, и клавиши на ней начинают залипать.
Конечно, некоторое время такую клавиатуру еще можно
использовать, но для нажатий клавиш приходиться использовать
большую силу.
Полное условие и решение задачи>>
Газон. Фермер Иван с юности следит за своим
газоном. Газон можно считать плоскостью, на которой в каждой
точке с целыми координатами растет один пучок травы.В одно из
воскресений Иван воспользовался газонокосилкой и постриг
некоторый прямоугольный участок газона. Стороны этого участка
параллельны осям координат, а две противоположные вершины
расположены в точках (x1, y1) и (x2, y2). Следует отметить, что
пучки травы, находящиеся на границе этого прямоугольника, также
были пострижены.
Полное условие и решение задачи>>
Вырубка деревьев. Король Флатландии решил
вырубить некоторые деревья, растущие перед его дворцом. Деревья
перед дворцом короля посажены в ряд, всего там растет N
деревьев, расстояния между соседними деревьями одинаковы. После
вырубки перед дворцом должно остаться M деревьев, и расстояния
между соседними деревьями должны быть одинаковыми. Помогите
королю выяснить, сколько существует способов вырубки деревьев.
Решение
задачи>>
Как готовить себя к олимпиадному программированию? — Хабр Q&A
В свое время было что-то подобное. Только в украинском варианте названия другие — школьная, районная, областная, всеукраинская.
В школе кроме меня программирование фактически никто не знал, на уроках информатики в те года почему-то убрали даже основы какого либо языка. Да и я тогда знал только немного паскаля/delphi. Но лучше варианта не нашлось, так что пошел я (для приличия все задачки в школе все же решил). Спокойно прошел районный этап (было четыре человека, которые тоже непонятно как туда попали — одна девочка ушла через 20 минут). К областному этапу я уже готовился. Особой системы у меня не было — я просто решал задачи на acmp.ru, acm.timus.ru. При необходимости гуглил необходимый алгоритм и старался разобраться в его реализации. Помогал с задачами на одном форуме, иногда и сам спрашивал. В результате за приблизительно 2 месяца такой подготовки я занял второе место) Набрал 69 баллов из 100 (2 задачи решил полностью, 2 частично). Недавно общался с преподавателем своим — говорит, до сих пор меня вспоминают (типа приехал какой-то паренёк из провинции и отобрал призовое место у местных лицеистов). Но я, чесно говоря, своим результатом не слишком доволен, 2 месяца на подготовку -это мало. Да и готовиться надо было более систематично.
Что бы я точно изменил — писал бы не на паскале:) Сейчас бы я выбрал Java. Недавно вернулся к некоторым задачам на acmp.ru — те задачи, где на паскале надо было изворачиваться, на Java решались элементарно. Например, не пришлось реализовывать длинную арифметику. Кто-то говорил, что часто можно упереться в Time Limit, но, честно говоря, это так себе аргумент — для большинства задач указанного лимита времени для Java с запасом. Небезызвестный Петр Митричев в соревнованиях её использует и уже столько лет показывает результат.
Да, питона у нас в проверяющей системе на олимпиаде не было. Теоретически на нем можно было писать на своем компьютере, его бы потом проверяли вручную. Но без доступа у тестирующей системе таким образом решать задачи никто не решился.
2020 | AlbanianAlbanian (Косово) ArabicArabic (алжирская) Arabic (сирийский) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) Китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGermanGreekHebrewHungarianIcelandicIndonesianJapaneseKoreanKyrgyzLatvianLithuanianMacedonianMongolianMontenegrinNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishTurkmenUkrainianUzbekVietnamese | ||||||||
2019 | AfrikaansAlbanianAlbanian (Косово) ArabicArabic (алжирская) арабский (марокканский) Arabic (Сирийская) Arabic (тунисский) арабский (ОАЭ) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKhmerKoreanKorean (Северная Корея) LatvianLithuanianMacedonianMongolianMontenegr inNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishTurkmenUkrainianUzbekVietnamese | ||||||||
2018 | AfrikaansAlbanianAlbanian (Косово) ArabicArabic (алжирская) арабский (марокканский) Arabic (Сирийская) Arabic (Тунисский) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) Китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKhmerKoreanLatvianLithuanianMacedonianMongolianMontenegrinNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishTurkmenUkrainianUzbekVietnamese | ||||||||
2017 | AfrikaansAlbanianAlbanian (Косово) ArabicArabic (алжирская) арабский (марокканский) Arabic (Сирийская) Arabic (тунисский) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) китайский (традиционный) Croa tianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKhmerKoreanLatvianLithuanianMacedonianMalayMongolianMontenegrinNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishTurkmenUkrainianUzbekVietnamese | ||||||||
2016 | AfrikaansAlbanianAlbanian (Косово) ArabicArabic (алжирская) арабский (марокканский) Arabic (Сирийская) Arabic (Тунисский) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) Китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKhmerKoreanKorean (Северная Корея) Латышский ЛитовскийМакедонскийМалайскийМонгольскийМонтенегринскийНорвежскийПерсидский (Фарси) ПольскийПортугальскийрумынскийРусскийСербскийСербский (BIH) СловацкийСловенскийИспанскийШведскийТайскийТурецкийУкраинскийУзбекскийВьетнамский | 000 | AfrikaansAlbanianArabicArabic (алжирская) арабский (марокканский) Arabic (сирийский) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) Китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKhmerKoreanKorean (Северная Корея) LatvianLithuanianMacedonianMalayMongolianMontenegrinNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishUkrainianUzbekVietnamese | ||||||
2014 | AfrikaansAlbanianArabicArabic (марокканский) Arabic (Сирийская) Arabic (тунисский) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKoreanKorean (Северная Корея) LatvianLithuanianMacedonianMalayMongolianMontenegrinNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbi anSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishUkrainianVietnamese | ||||||||
2013 | AfrikaansAlbanianArabicArabic (марокканский) Arabic (сирийский) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) Китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKoreanKorean (Северная Корея) LatvianLithuanianMacedonianMalayMongolianMontenegrinNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishUkrainianVietnamese | ||||||||
2012 | африкаансалбанский арабский арабский (марокканский) арабский (сирийский) арабский (тунисский) армянский азербайджанскийбоснийский болгарский китайский (упрощенный) китайский (традиционный) хорватский чешскийдатский голландский английский французский языкицкийский итальянский языкиндийский язык английский корейский китайский язык индийский язык английский корейский язык индийский язык итальянский язык английский корейский индийский язык vianLithuanianMacedonianMalayMongolianMontenegrinNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishUkrainianVietnamese | ||||||||
2011 | AfrikaansAlbanianArabicArabic (кувейтский) арабский (марокканский) Arabic (сирийский) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) Китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKoreanLatvianLithuanianMacedonianMalayMongolianMontenegrinNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishUkrainianUzbekVietnamese | ||||||||
2010 | Албанский Арабский Арабский (Кувейт) Арабский (Марокканский) Арабский (Сирийский) Армянский АзербайджанскийБоснийскийБолгарскийКитайский (Упрощенный) Китайский (Традиционный) ХорватскийЧиннскийДатскийДатскийфранцузский rgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKhmerKoreanKorean (Северная Корея) LatvianLithuanianMacedonianMalayMongolianNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SinghaleseSlovakSlovenianSpanishSwedishThaiTurkishUkrainianUzbekVietnamese | ||||||||
2009 | AfrikaansAlbanianArabicArabic (марокканский) Arabic (сирийский) ArmenianAzerbaijaniBosnianBulgarianChinese (упрощенный) Китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKhmerKoreanKorean (Северная Корея) LatvianLithuanianMacedonianMalayMongolianNorwegianPersian (фарси ) ПольскийПортугальскийРумынскийРусскийСербскийСербский (BIH) СингальскийСловацкийСловенскийИспанскийШведскийТайскийТурецкийУкраинскийУзбекскийВьетнамский | ||||||||
2008 | Албанский (Азербайджанский) Арабский (Арабский) Арабский (Арабский) Маршрутный (Арабский) implified) Китайский (традиционный) CroatianCzechDanishDutchEnglishEstonianFinnishFrenchGeorgianGermanGreekHebrewHungarianIcelandicIndonesianItalianJapaneseKazakhKhmerKoreanKorean (Северная Корея) LatvianLithuanianMacedonianMalayMongolianNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SlovakSlovenianSpanishSwedishThaiTurkishUkrainianUzbekVietnamese | ||||||||
2007 | ArabicArabic (марокканский) AzerbaijaniBosnianBulgarianChinese (упрощенный) Китайский (традиционный) CroatianCzechDanishDutchEnglishFrenchGermanHebrewIcelandicIndonesianItalianKhmerKoreanKorean (Северная Корея) LithuanianMacedonianNorwegianPersian (Фарси) Польский Румынский Сербский Словацкий Словенский Испанский Тайский Турецкий Украинский Узбекский вьетнамский | ||||||||
2006 | Африкаанс Албанский Арабский Арабский Арабский (Кувейт) Арабский (Азербайджанский) Испанский Хорватский Хорватский Арабский (Кувейтский) Арабский (Азербайджанский, Марокканский) Армянский lishEstonianFinnishFrenchGeorgianGermanHebrewHungarianIcelandicItalianJapaneseKoreanLatvianLithuanianMacedonianMalayMongolianNorwegianPersian (фарси) PolishPortugueseRomanianRussianSerbianSerbian (БиГ) SinghaleseSlovakSlovenianSpanishSwedishThaiTurkishUkrainianUzbekVietnamese | ||||||||
2005 | EnglishSpanish | ||||||||
2004 | EnglishSpanish | ||||||||
2003 | EnglishSpanish | ||||||||
2002 | Английский | ||||||||
2001 | Английский | ||||||||
2000 | Английский | ||||||||
1998 | Английский | ||||||||
Английский Французский | |||||||||
1996 | Английский | ||||||||
1995 | Английский | 1994 9000 | 1994 9000 | Английский | |||||
1992 | Английский | ||||||||
1991 | Английский | ||||||||
1990 | Английский Английский | ||||||||
1988 | Английский | ||||||||
1987 | Английский | ||||||||
1986 | Английский | английский | |||||||
1984 | Английский | ||||||||
1983 | Английский | ||||||||
1982 | |||||||||
1979 | BulgarianCzechEnglishFinnishFrenchGermanGreekHebrewHungarianPolishPortugueseRomanianSerbianSlovakSwedishVietnamese | ||||||||
1978 | Английский | ||||||||
1977 | Английский | ||||||||
1976 | Английский | ||||||||
1975 | Английский | ||||||||
1974 | Английский | ||||||||
1973 | Английский ish | ||||||||
1972 | Английский | ||||||||
1971 | Английский | ||||||||
1970 | |||||||||
1970 | Английский 9000 | ||||||||
1968 | Английский | ||||||||
1967 | Английский | ||||||||
1966 | Английский | ||||||||
1964 | Английский | ||||||||
1963 | Английский | ||||||||
1962 | Английский | 10 | |||||||
1960 | Английский | ||||||||
1959 | Английский |
.
Номер олимпиады | Год | Принимающая страна | Город | Проблемы и решения | ||||||||||||||||||||||||
19 | 2018 | Вьетнам 9000i 9000i Экспериментальный 5 Теоретический экзамен | ||||||||||||||||||||||||||
18 | 2017 | Россия | Якутск | Экспериментальный экзамен Теоретический экзамен | ||||||||||||||||||||||||
17 | 2016 | Гонконг (Китай) | Экспериментальный экзамен Теоретический экзамен | |||||||||||||||||||||||||
16 | 2015 | Китай | Ханчжоу | Экспериментальный экзамен Теоретический экзамен | ||||||||||||||||||||||||
15 | 2014 | Сингапур Теоретический | ||||||||||||||||||||||||||
14 | 2013 | Индонезия | Богор | Экспериментальный экзамен Теоретический экзамен | ||||||||||||||||||||||||
13 | 2012 | Индия | Нью-Дели | Экспериментальный экзамен | ||||||||||||||||||||||||
Тель-Авив | Экспериментальный экзамен Теоретический экзамен | |||||||||||||||||||||||||||
11 | 2010 | Тайвань | Тайбэй | Экспериментальный экзамен Теоретический экзамен | ||||||||||||||||||||||||
9 | 2008 | Монголия | Улан-Батор | Экспериментальный экзамен Теоретический экзамен | ||||||||||||||||||||||||
8 | 2007 | Китай 9000i Экспериментальный | Китай 9000i теоретический экзамен | |||||||||||||||||||||||||
7 | 2006 | Казахстан | Алматы | Экспериментальный экзамен Теоретический экзамен | ||||||||||||||||||||||||
6 | 2005 | Индонезия | Индонезия | Экспериментальный
. |