HDU4717
2016-04-08 13:01
281 查看
Problem: The Moving Points
Description: 平面坐标系中有n个点,这些点都会按照一定的速度(矢量)移动。让你求这些点任意两点间距离最大值在某一时刻的最小值。
Solution: 三分。一开始我是读错题目了,我以为是求任意两点间距离的最小值。我们写出两点距离公式就会知道,这是一个关于时间T的二次函数。那么就是一个凹函数。这个时候三分是最合适的解法了。
Code(C++):
Description: 平面坐标系中有n个点,这些点都会按照一定的速度(矢量)移动。让你求这些点任意两点间距离最大值在某一时刻的最小值。
Solution: 三分。一开始我是读错题目了,我以为是求任意两点间距离的最小值。我们写出两点距离公式就会知道,这是一个关于时间T的二次函数。那么就是一个凹函数。这个时候三分是最合适的解法了。
Code(C++):
#include <stdio.h> #include <string.h> #include <math.h> #define MAX(a,b) ((a)>(b)? (a):(b)) const int M=305; typedef struct tagPoint{ int x,y; int vx,vy; }Point; int n; Point points[M]; double cal(double time) { double ans=0; for(int i=0;i<n-1;i++){ Point a=points[i]; for(int j=i+1;j<n;j++){ Point b=points[j]; double X=(a.x-b.x+time*(a.vx-b.vx)); double Y=(a.y-b.y+time*(a.vy-b.vy)); double tmp=X*X+Y*Y; ans=MAX(ans,tmp); } } return ans; } double tFind() { double l=0,r=1e6; double mid,mmid; for(int i=0;i<100;i++){ mid=(l+r)/2; mmid=(mid+r)/2; cal(mid)<cal(mmid)? r=mmid:l=mid; } return mid; } int main() { int N,K=1; for(scanf("%d",&N);N--;){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d%d%d",&points[i].x,&points[i].y, &points[i].vx,&points[i].vy); double time=tFind(); printf("Case #%d: %.2f %.2f\n",K++,time,sqrt(cal(time))); } return 0; }
相关文章推荐
- Python——在Linux和Windows下创建Django项目
- C++ string 与 C char *
- Android Studio配置初识
- UVA 11529-Strange Tax Calculation-求三角形内点数 /二分/two pointers
- 常见js 函数集合总结
- Android Studio配置初识
- 常见网站盈利模式
- 经典SQL语句大全、50个常用的sql语句
- mysql锁等待分析
- 【ThinkingInC++】75、多重继承
- web安全之token
- 2013 语言包无法运行解决方法
- 最小公倍数公约数(gcd函数)(模板)
- Spring MVC工作流程图
- ECSHOP 如何将商品价格的样式修改掉或者是price_format函数修改
- 再见SIM卡,你好eSIM
- HttpServlet 请求 回应详解
- QT:Qt中Ui名字空间以及setupUi函数的原理和实现
- Android中滑动冲突的解决方案
- 在ubuntu上安装svn+apache2