POJ 3400 Line belt

//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;
}

發佈了55 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章