HDU 3400 - Line belt (三分)
来源:互联网 发布:js多行注释 编辑:程序博客网 时间:2024/06/06 02:19
Problem Description
In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's speed on AB is P and on CD is Q, he can move with the speed R on other area on the plane.
How long must he take to travel from A to D?
How long must he take to travel from A to D?
Input
The first line is the case number T.
For each case, there are three lines.
The first line, four integers, the coordinates of A and B: Ax Ay Bx By.
The second line , four integers, the coordinates of C and D:Cx Cy Dx Dy.
The third line, three integers, P Q R.
0<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
For each case, there are three lines.
The first line, four integers, the coordinates of A and B: Ax Ay Bx By.
The second line , four integers, the coordinates of C and D:Cx Cy Dx Dy.
The third line, three integers, P Q R.
0<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
Output
The minimum time to travel from A to D, round to two decimals.
Sample Input
10 0 0 100100 0 100 1002 2 1
Sample Output
136.60
---------------------------------------
题意:
在ab上的速度为p,cd上的速度为q,其他路为r,求出从a到d的最少用时。
思路:
在ab上找到一点e, cd上找到一点f, 使得 ae/p + ef/r + fd/q最小,t1 = ae / p, 线性; t2 = ef/r + fd/ q, 递减到递增函数。分别在ab 和 cd上 使用三分(嵌套三分),找到最佳的e ,f点。
eps = 1e-8. 精度不够会WA。
CODE:
#include <iostream>#include <cstdio>#include <cmath>using namespace std;const double eps = 1e-8;struct Point { double x, y;};double p, q, r;Point a, b, c, d, e, f;double dis(Point u, Point v){ return sqrt((u.x - v.x)*(u.x - v.x) + (u.y - v.y)*(u.y - v.y));}double cal(double m){ f.x = c.x + (d.x - c.x) * m; f.y = c.y + (d.y - c.y) * m; return dis(f, d) / q + dis(f, e) / r;}double road(double m){ e.x = a.x + (b.x - a.x) * m; e.y = a.y + (b.y - a.y) * m; double l =0.0, r = 1.0, mid, mmid; while(r - l > eps) { mid = (l + r)/2.0; mmid = (mid+r)/2.0; if(cal(mid) < cal(mmid)) r = mmid; else l = mid; } return cal(l) + dis(a, e) / p;}void solve(){ double l = 0.0, r = 1.0, mid, mmid; while(r - l > eps) { mid = (l + r) / 2.0; mmid = (r + mid) / 2.0; if(road(mid) < road(mmid)) r = mmid; else l = mid; } printf("%.2lf\n", road(l));}int main(){//freopen("in", "r", stdin); 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, &r); solve(); } return 0;}
0 0
- hdu 3400 Line belt(三分)
- HDU 3400 Line belt(三分)
- Hdu 3400 Line belt (三分)
- HDU 3400 - Line belt (三分)
- HDU 3400 Line belt(嵌套三分)
- HDU 3400 Line belt 三分
- HDU 3400 Line belt 三分
- HDU 3400 Line belt(三分)
- hdu 3400 Line belt 三分
- HDU 3400 Line belt 三分
- hdu 3400 Line belt(三分套三分)
- HDU 3400 Line belt (三分套三分)
- 三分套三分 --- HDU 3400 Line belt
- HDU 3400 Line belt (三分再三分)
- hdu 3400 Line belt 双三分
- hdu 3400 Line belt【三分嵌套】
- Line belt(hdu 3400,内嵌三分)
- hdu 3400Line belt 经典 三分
- 整个表格居中显示在网页
- Java_网络编程_使用UDP协议发送及接收数据
- [LeetCode]59.Spiral Matrix II
- 国内实际装机量最高的无线抄表模块APC240F,数量超过百万只
- 从win10体验到重装win8
- HDU 3400 - Line belt (三分)
- trace
- Unity3d(C#)错误提示:禁止在线程中进行游戏对象比较!
- C++ 虚继承
- codeforces Limit
- 单片机、P0口、上拉电阻
- Codeforces 490C Hacking Cypher(暴力)
- 了解开发手机的各项参数之显示屏
- Tzl_C#金字塔_Interface接口使用总结