Писал тернарный поиск на python для задачи, получил ответ, он не сошелся с примером в задаче. Посмотрел правильный код на C++ - в нем та же структура, но ответ другой. Прикладываю код на python, на плюсах и input&output из задачи.
python:
Vp, Vf = map(float, input().split())
a = float(input())
def f(x):
global Vp, Vf, a
return ((1-a)**2 + x**2)/Vp + (a**2+(1-x)**2)/Vf
l = 0
r = 1
while r - l > 1e-8:
a = (2*l + r) / 3
b = (l + 2*r) / 3
print(a, b)
if f(a) < f(b):
r = b
else:
l = a
print("%.9f" % ((l+r)/2))
c++:
#include <bits/stdc++.h>
using namespace std;
#define forn(i, n) for (int i = 0; i < (int)(n); i++)
int main( void ) {
long double vp, vf, a;
cin >> vp >> vf >> a;
auto f = [&](long double x) {
return hypotl(1 - a, x) / vp + hypotl(a, 1 - x) / vf;
};
long double l = 0, r = 1;
while (r - l > 1e-8) {
auto a = (2 * l + r) / 3;
auto b = (l + 2 * r) / 3;
if (f(a) < f(b))
r = b;
else
l = a;
}
printf("%.9f\n", (double)((l + r) / 2));
}
Примеры:
Не понимаю, в чем проблема. Искал подобные вопросы, но в них, наоборот, в коде на плюсах вычислялся неправильный ответ (из-за неправильного употребления float и double). Думал, это из-за различий в операциях деления на разных языках, но на первых нескольких итерациях while в обоих случаях дает одни и те же ответы.
UPD: Вот несколько первых результатов перерасчетов a и b в while на си и питоне + ответы
Что не так?