- Описание
- Отправленные решения
322. Безградиентная оптимизация функции
Это интерактивная задача
Человечество получило в своё распоряжение мощнейший инструмент, позволяющий измерять высоту относительно уровня моря. С его помощью можно обнаружить все горные пики на нашей планете.
Вам наверняка хочется назвать какой-нибудь пик в свою честь. Вы даже знаете, где его искать. Но есть загвоздка: инструмент измеряет высоту только в заданной точке, а число попыток ограничено.
Более формально, есть функция от двух аргументов , заданная на квадрате , обладающая липшицевым градиентом и имеющая несколько точек локального максимума . Сам вид функции и число точек локального максимума неизвестны, гарантируется лишь, что все точки локального максимума лежат в квадрате . При поиске локального максимума программа может делать запрос о величине функции в определенной точке.
Требуется найти один из локальных максимумов, сделав не более 200 запросов.
Формат ввода
В первой строке входных данных будут находиться три вещественных числа (, ), где и — координаты стартовой точки, от которой имеет смысл начинать поиск, а — значение .
Формат вывода
Чтобы узнать значение функции в очередной точке , выведите строку, содержащую координаты этой точки,
разделённые пробелом — вида .
После этого выведите перевод строки и сделайте операцию flush
.
Замечание: если ваша точка лежит вне квадрата , вы получите вердикт <<Неправильный формат вывода>>
После выполнения запроса на вход вашей программе будет подана информация о значении функции в текущей точке, а также информация о том, находится ли данная точка достаточно близко к некоторому локальному максимуму. Обозначим за значение функции в текущей точке. Возможны два варианта:
- Если расстояние от заданной вами точки до ближайшего локального максимума больше , то на входе будет строка вида "" (минус ('-') и значение функции, разделённые пробелом).
- Если расстояние от заданной вами точки до ближайшего локального максимума не больше , то на входе будет строка вида "" (плюс ('+') и значение функции, разделённые пробелом).
В последнем случае ваша программа должна немедленно завершиться (например, вызовом exit(0)
).
Замечание: значение функции выводится с точностью .
Если ваша программа не смогла за 200 запросов найти одну из точек локального максимума, то вы получите вердикт <<Неправильный ответ>>.
Ваше решение получит вердикт <<Решение зависло>> (IL), если вы не будете ничего выводить
или забудете сделать операцию flush
после вывода запроса.
Чтобы выполнить операцию flush
, можете использовать (сразу после вывода запроса и перевода строки):
fflush(stdout)
в C++sys.stdout.flush()
в Python
Примечание
Ниже показан пример взаимодействия программы и интерактора.
В данном случае программа сделала 4 запроса, причем последняя точка оказалась достаточно близко к некоторой точке локального максимума. Обнаружив это, программа ничего не выводит, а завершается с кодом возврата 0.
Ограничения
Ограничение времени
1 с
Ограничение памяти
64 МБ