Более «элегантное» решение см. В решении 2.
Решение 1)
Почему бы вам не создать все возможные 300 * 300/2 или (300 * 299/2) возможные точные значения R, отсортировать их в массив B, скажем, а затем дать R найдите ближайшее значение R в B, используя бинарный поиск, а затем выберите соответствующие X и Y.
Я предполагаю, что наличие массива B (с информацией X & Y) не будет большой проблемой памяти и может быть легко закодировано (используя код для написания кода!: -)).
Это будет достаточно быстро: в худшем случае ~ 17 сравнений.
Решение 2)
Возможно, вы также можете сделать следующее (не пытался это доказать, но кажется правильным):
Вести массив значений 1 / X, отсортированных.
Теперь, учитывая R, вы пытаетесь найти ближайшую сумму к 1 / R с двумя числами в массиве 1 / X.
Для этого вы поддерживаете два указателя на массив 1 / X, один наименьший и один на самый большой, и продолжаете увеличивать один и уменьшать другой, чтобы найти ближайший к 1 / R. (Это классический вопрос для собеседования: найдите, если в отсортированном массиве есть два числа, сумма которых равна X)
Это будет O (n) сравнений и дополнений в худшем случае. Это также подвержено проблемам с точностью. Вы можете избежать некоторых проблем с точностью, если будете поддерживать отсортированный в обратном порядке массив X.