322. Безградиентная оптимизация функции

Не решаласьСложная

Это интерактивная задача

Человечество получило в своё распоряжение мощнейший инструмент, позволяющий измерять высоту относительно уровня моря. С его помощью можно обнаружить все горные пики на нашей планете.

Вам наверняка хочется назвать какой-нибудь пик в свою честь. Вы даже знаете, где его искать. Но есть загвоздка: инструмент измеряет высоту только в заданной точке, а число попыток ограничено.

Более формально, есть функция от двух аргументов f(x,y)f(x, y), заданная на квадрате [50;100]×[50;100][-50; 100] \times [-50; 100], обладающая липшицевым градиентом и имеющая несколько точек локального максимума (x1,y1),(xk,yk)(x_1^{*}, y_1^{*}), \dots (x_k^{*}, y_k^{*}). Сам вид функции и число точек локального максимума неизвестны, гарантируется лишь, что все точки локального максимума лежат в квадрате [0;50]×[0;50][0;50] \times [0;50]. При поиске локального максимума программа может делать запрос о величине функции в определенной точке.

Требуется найти один из локальных максимумов, сделав не более 200 запросов.

Формат ввода

В первой строке входных данных будут находиться три вещественных числа X0,Y0,H0X_0, Y_0, H_0 (50X0100-50 \le X_0 \le 100, 50Y0100-50 \le Y_0 \le 100), где X0X_0 и Y0Y_0 — координаты стартовой точки, от которой имеет смысл начинать поиск, а H0H_0 — значение f(X0,Y0)f(X_0, Y_0).

Формат вывода

Чтобы узнать значение функции ff в очередной точке (Xi,Yi)(X_i, Y_i), выведите строку, содержащую координаты этой точки, разделённые пробелом — вида XiX_i YiY_i. После этого выведите перевод строки и сделайте операцию flush.

Замечание: если ваша точка лежит вне квадрата [50;100]×[50;100][-50; 100] \times [-50; 100], вы получите вердикт <<Неправильный формат вывода>>

После выполнения запроса на вход вашей программе будет подана информация о значении функции в текущей точке, а также информация о том, находится ли данная точка достаточно близко к некоторому локальному максимуму. Обозначим за hih_i значение функции в текущей точке. Возможны два варианта:

  • Если расстояние от заданной вами точки до ближайшего локального максимума больше 10210^{-2}, то на входе будет строка вида " hi-\ h_i" (минус ('-') и значение функции, разделённые пробелом).
  • Если расстояние от заданной вами точки до ближайшего локального максимума не больше 10210^{-2}, то на входе будет строка вида "+ hi+\ h_i" (плюс ('+') и значение функции, разделённые пробелом).

В последнем случае ваша программа должна немедленно завершиться (например, вызовом exit(0)).

Замечание: значение функции выводится с точностью 10810^{-8}.

Если ваша программа не смогла за 200 запросов найти одну из точек локального максимума, то вы получите вердикт <<Неправильный ответ>>.

Ваше решение получит вердикт <<Решение зависло>> (IL), если вы не будете ничего выводить или забудете сделать операцию flush после вывода запроса.

Чтобы выполнить операцию flush, можете использовать (сразу после вывода запроса и перевода строки):

  • fflush(stdout) в C++
  • sys.stdout.flush() в Python

Примечание

Ниже показан пример взаимодействия программы и интерактора.

В данном случае программа сделала 4 запроса, причем последняя точка оказалась достаточно близко к некоторой точке локального максимума. Обнаружив это, программа ничего не выводит, а завершается с кодом возврата 0.

Ограничения

Ограничение времени

1 с

Ограничение памяти

64 МБ

Теги

Нужно войти, чтобы отправить решение.Войти