HDU 3400

果然是你存我我深深的脑海里,思路有了,调了那么久,进水了。。。

三分一边后,嵌套三分另一边。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const double eps=1e-6;

struct Point{
	double x,y;
};

Point a,b,c,d;
double p,q,rr;

double how(Point dont,Point dot){
	double ans1=sqrt((dot.x-d.x)*(dot.x-d.x)+(dot.y-d.y)*(dot.y-d.y))/q	;
	double ans2=sqrt((dont.x-dot.x)*(dont.x-dot.x)+(dont.y-dot.y)*(dont.y-dot.y))/rr;
	return ans1+ans2;
}

double cal(Point dont){
	Point l,r,m,mm;
	l=c,r=d;
	while(sqrt((l.x-r.x)*(l.x-r.x)+(l.y-r.y)*(l.y-r.y))>=eps){
			m.x=(l.x+r.x)/2;
			m.y=(l.y+r.y)/2;
			mm.x=(m.x+r.x)/2;
			mm.y=(m.y+r.y)/2;
		if(how(dont,m)>how(dont,mm))
		l=m;
		else r=mm;
	}
	double lt=sqrt((dont.x-a.x)*(dont.x-a.x)+(dont.y-a.y)*(dont.y-a.y))/p;
	return how(dont,l)+lt;
}

int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
		scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
		scanf("%lf%lf%lf",&p,&q,&rr);
		Point l,r,m,mm;
		l=a; r=b;
		while(sqrt((l.x-r.x)*(l.x-r.x)+(l.y-r.y)*(l.y-r.y))>=eps){
			m.x=(l.x+r.x)/2;
			m.y=(l.y+r.y)/2;
			mm.x=(m.x+r.x)/2;
			mm.y=(m.y+r.y)/2;
			if(cal(m)>cal(mm))
			l=m;
			else r=mm;
		}
		printf("%.2lf\n",cal(l));
	}
	return 0;
}

  

posted @ 2015-02-05 10:12  chenjunjie1994  阅读(214)  评论(0编辑  收藏  举报