HDU 3700 Line belt
2016-04-09 16:20
169 查看
Line belt
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3669 Accepted Submission(s): 1407
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?
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
Output
The minimum time to travel from A to D, round to two decimals.
Sample Input
1 0 0 0 100 100 0 100 100 2 2 1
Sample Output
136.60
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string.h> #include <algorithm> using namespace std; const double eps = 1e-6; double p,q,rr; struct node{ double x,y; }; double dis(node a,node b){ return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ); } //a - midd - mid - b double tritri(node a,node b,node m) { node l,r; l = a , r = b; node mid,midd; double ans1,ans2; while(1){ mid.x = (l.x+r.x)/2.0; mid.y = (l.y+r.y)/2.0; midd.x = (l.x+mid.x)/2.0; midd.y = (l.y+mid.y)/2.0; ans1 = dis(mid,a)/q + dis(mid,m)/rr; ans2 = dis(midd,a)/q + dis(midd,m)/rr; if(ans1<ans2) l = midd; else r = mid; if( fabs(ans1-ans2)< eps) return ans1; } } //c - midd - mid - 0 - d double tri (node a,node b,node c,node d){ node l,r; l = c , r = d; node mid,midd; double ans1,ans2; while(1){ mid.x = (l.x+r.x)/2.0; mid.y = (l.y+r.y)/2.0; midd.x = (l.x+mid.x)/2.0; midd.y = (l.y+mid.y)/2.0; ans1 = dis(mid,d)/q + tritri(a,b,mid); ans2 = dis(midd,d)/q + tritri(a,b,midd); if(ans1<ans2) l = midd; else r = mid; if( fabs(ans1-ans2)< eps) return ans1; } } int main() { int i,j,k,t,m,n; node a,b,c,d; cin>>t; while(t--){ scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y); scanf("%lf%lf%lf",&p,&q,&rr); double ans = tri(a,b,c,d); printf("%.2lf",ans); cout<<endl; } return 0; }
相关文章推荐
- 软件过程与项目管理(第六周作业)
- Webservice开发概念
- jQuery不起作用,八成是jQuery语句出错了
- 任务分配
- WordPress主题 DUX原版 Pro Plus 小清新CMS主题带用户中心[更新至1.4]
- ABP源码分析二十六:核心框架中的一些其他功能
- Android RecyclerView添加分隔线 DividerItemDecoration
- 发明家的原创时代
- 团队作业(一)
- HDU 4489 The King’s Ups and Downs (DP)
- 士兵杀敌(二) nyoj116
- WordPress主题 Music Pro 高级音乐/电台自适应音乐销售模板[更新至v3.1]
- JNI - Access an instance Field
- php实现基于微信公众平台开发SDK(demo)扩展的方法
- constraintWithItem:函数
- motto4
- [LeetCode] 196. Delete Duplicate Emails
- 10020---
- 一个小学生练习题 能实现基本的加减乘除
- 针对中科院java接口的使用方法和问题