Алгоритмы на С++
Решение задачи 2 главы 5
Оптический танк. Танк должен выехать с базы, пересечь пустынную и болотистую местность и прибыть на пост. Препятствий по пути нет, танк может двигаться в любом направлении. Известно, что прямая, соединяющая базу и пост, проходит по обеим территориям. Определите путь, по которому танк приедет на пост быстрее всего.
Вход. Первая строка текста содержит два числа - скорости танка по пустыне и болоту (м/с). Вторая строка содержит координаты базы, третья - координаты поста. Известно, что ось Ох разделяет пустынную и болотистую территории (пустынная наверху, болотистая внизу), координата у базы положительна, у поста - отрицательна. Все числа действительные.
Выход. Вывести два числа: абсциссу координаты места, в котором танк пересекает границу пустынной и болотистой местности, и время движения от базы до поста. Оба числа выводить ка дробные, с возможной ошибкой не более .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
double get_time(double x1,double y1,double x2, double y2, double v1, double v2,double x0) {// www.itmathrepetitor.ru if (!v1 || !v2) return 0; return sqrt((x0-x1)*(x0-x1)+y1*y1)/v2+sqrt((x0-x2)*(x0-x2)+y2*y2)/v1; } void itmathrepetitor_ru() { double xmax,xmin,x1,y1,x2,y2,v1,v2; // www.itmathrepetitor.ru double e=0.00001; v1=3; v2=5; x1=20; y1=10; x2=8; y2=-9; if (fabs(x1-x2)<=e) { cout<<"("<<x1<<";0), "<<get_time(x1,y1,x2,y2,v1,v2,x1); return; } xmin=x2; xmax=x1; if (x1<=x2) { xmin=x1; // www.itmathrepetitor.ru xmax=x2; } while (xmin<=xmax) { if (get_time(x1,y1,x2,y2,v1,v2,xmin)>get_time(x1,y1,x2,y2,v1,v2,xmin+e)) xmin+=e; else break; // www.itmathrepetitor.ru } cout<<"("<<xmin<<";0), "<<get_time(x1,y1,x2,y2,v1,v2,xmin); } |