您的位置:首页 > 其它

专题二 · 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  suanfa