专题二 · 1016
2016-04-22 21:47
232 查看
代码及解释
#include <cstdio> #include <cmath> // 无脑三分法 // 直接在固定一边的情况下三分就可以 // // 比较恶心的就是要写很多运算=-= struct point { double x, y; }; double dis(point a, point b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); } double p,q,r; double find2(point a, point c, point d) { point left, right; point mid, midmid; double t1,t2; left = c; right = d; do { mid.x = (left.x + right.x) / 2; mid.y = (left.y + right.y) / 2; midmid.x = (mid.x + right.x) / 2; midmid.y = (mid.y + right.y) / 2; t1 = dis(a, mid) / r + dis(mid, d) / q; t2 = dis(a, midmid) / r + dis(midmid, d) / q; if(t1 > t2) left=mid; else right=midmid; } while(dis(left, right) >= 1e-5); return t1; } double find(point a, point b, point c, point d) { point left, right; point mid, midmid; double t1, t2; left = a; right = b; do { mid.x = (left.x + right.x) / 2; mid.y = (left.y + right.y) / 2; midmid.x = (mid.x + right.x) / 2; midmid.y = (mid.y + right.y) / 2; t1 = dis(a, mid) / p + find2(mid, c, d); t2 = dis(a, midmid) / p + find2(midmid, c, d); if(t1 > t2) left = mid; else right = midmid; } while(dis(right, left) >= 1e-5); return t1; } int main() { int t; point a, b, c, d; scanf("%d", &t); while(t--) { scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y,&p,&q,&r); printf("%.2lf\n",find(a,b,c,d)); } return 0; }
相关文章推荐