HDOJ 4747 - The Moving Points 三分搜索...
2013-09-11 22:29
281 查看
题意:
在xy坐标系下有N个点..每个点沿着一个射线的方向以一定的速度运动..问什么时候最长的两两点距离最短...并且为多长
题解:
这类题目感觉做过..可以推断出答案只存在一个峰值(并且一定..要么时间就不是唯一的了)...对于单峰/单谷函数找最值..用三分搜索就是...
Program:
在xy坐标系下有N个点..每个点沿着一个射线的方向以一定的速度运动..问什么时候最长的两两点距离最短...并且为多长
题解:
这类题目感觉做过..可以推断出答案只存在一个峰值(并且一定..要么时间就不是唯一的了)...对于单峰/单谷函数找最值..用三分搜索就是...
Program:
#include<iostream> #include<stack> #include<queue> #include<stdio.h> #include<algorithm> #include<string.h> #include<cmath> #define ll long long #define oo 1000000007 #define eps 1e-5 #define MAXN 100010 using namespace std; struct node { double x,y,vx,vy; }P[305]; double q[305][2]; double getit(int n,double t) { int i,j; double MaxDis=0; for (i=1;i<=n;i++) q[i][0]=P[i].x+P[i].vx*t,q[i][1]=P[i].y+P[i].vy*t; for (i=1;i<=n;i++) for (j=1;j<=n;j++) MaxDis=max(MaxDis,sqrt((q[i][0]-q[j][0])*(q[i][0]-q[j][0])+(q[i][1]-q[j][1])*(q[i][1]-q[j][1]))); return MaxDis; } int main() { int C,i,n,cases; scanf("%d",&C); for (cases=1;cases<=C;cases++) { scanf("%d",&n); for (i=1;i<=n;i++) scanf("%lf%lf%lf%lf",&P[i].x,&P[i].y,&P[i].vx,&P[i].vy); double l,r,mid,midmid; l=0,r=1e+60; while (r-l>eps) { mid=(l+r)/2,midmid=(l+mid)/2; if (getit(n,mid)<getit(n,midmid)) l=midmid; else r=mid; } printf("Case #%d: %.2f %.2f\n",cases,r,getit(n,r)); } return 0; }
相关文章推荐
- HDU 4717 The Moving Points (三分搜索)
- hdu 4717 - The Moving Points(三分)
- HDU 4717 The Moving Points (三分 模板)
- HDU - 4717 The Moving Points —— 三分
- HDU 4717 The Moving Points (三分 模板)
- HDU - 4717 The Moving Points —— 三分
- The Moving Points HDU - 4717 (三分)
- HDU 4717 The Moving Points (三分 模板)
- HDU 4717 The Moving Points(三分)
- The Moving Points -HDU 4717 三分
- hdu 4717 The Moving Points(三分)
- hdu 4717 The Moving Points(三分)
- HDU 4717 The Moving Points (三分 模板)
- hdu4717 The Moving Points 三分
- The Moving Points HDU - 4717 (三分查找)
- HDOJ 题目2438 Turn the corner(三分搜索)
- HDU 4717 The Moving Points (三分 模板)
- hdu 4717 The Moving Points(三分)
- HDU 4717 The Moving Points (三分)
- hdu 4717 The Moving Points(三分)