//POJ 3400 Line belt
//AC by warteac
//2013-7-23
/*
三分套三分
*/
#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
using namespace std;
typedef double pType;
const double eps = 1e-5;
struct point{
pType x;
pType y;
point(){}
point(pType x1, pType y1){
x = x1; y = y1;
}
//重載>>
friend istream& operator >> (istream& in, point &p){
in >> p.x >> p.y;
return in;
}
};
point a,b,c,d;
double p,q,r;
double length(point p1, point p2){
return sqrt((p1.x - p2.x)*(p1.x - p2.x)+(p1.y - p2.y)*(p1.y - p2.y));
}
double three_find2(point m, point c, point d){
point mid1, mid2, left, right;
left = c; right = d;
double t1, t2;
while(length(left,right) > eps){
//do{
mid1.x = left.x + (right.x - left.x)/3;
mid1.y = left.y + (right.y - left.y)/3;
mid2.x = left.x + (right.x - left.x)*2/3;
mid2.y = left.y + (right.y - left.y)*2/3;
t1 = length(d,mid1)/q + length(m,mid1)/r; //WA,d寫成了right
t2 = length(d,mid2)/q + length(m,mid2)/r;
if(t1 > t2) left = mid1;
else right = mid2;
}
//}while(fabs(t1 - t2) > eps);
return length(d,right)/q + length(m,right)/r; //WA
//return t2;
}
double three_find(point a, point b, point c, point d){
point mid1, mid2, left, right;
left = a; right = b;
double t1,t2;
while(length(left,right) > eps){
//do{
mid1.x = left.x + (right.x - left.x)/3;
mid1.y = left.y + (right.y - left.y)/3;
mid2.x = left.x + (right.x - left.x)*2/3;
mid2.y = left.y + (right.y - left.y)*2/3;
t1 = length(a,mid1)/p + three_find2(mid1,c,d); //WA,a寫成了left,遞歸的時候left變化了
t2 = length(a,mid2)/p + three_find2(mid2,c,d);
if(t1 > t2) left = mid1;
else right = mid2;
}
//}while(fabs(t1 - t2) > eps);
return length(a,right)/q + three_find2(right,c,d);//WA
//return t2;
}
int main(){
int n;
cin >> n;
while(n--){
cin >> a >> b >> c >> d;
cin >> p >> q >> r;
cout <<setiosflags(ios::fixed);
cout << setprecision(2);
cout << three_find(a,b,c,d) << endl;
}
return 0;
}
POJ 3400 Line belt
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.