您的位置:首页 > 其它

HDU4717

2016-04-08 13:01 281 查看
Problem: The Moving Points

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