HDU 4717 The Moving Points

来源:互联网 发布:淘宝网秋冬半身裙 编辑:程序博客网 时间:2024/06/18 04:04

题意:给定n个点,然后这些点朝着给定的方向走,,在某个时间后,点停下来,可以求得此时任意两点之间的最大距离。问何时停止可以使得任意两点之间的最大距离最小。

思路:三分时间,判断条件是求出时间的情况下,任意两点之间的最大距离就好了。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const double eps=1e-8;const int MAX=330;int n;double x[MAX],y[MAX],vx[MAX],vy[MAX];double cal(double t){    double ret=0;    for(int i=0;i<n;i++)        for(int j=i+1;j<n;j++)        {            double x1=x[i]+vx[i]*t;            double y1=y[i]+vy[i]*t;            double x2=x[j]+vx[j]*t;            double y2=y[j]+vy[j]*t;            ret=max(ret,sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));        }        return ret;}double solve(){    double l=0,r=1e10;    while(r-l>=eps)    {        double mid1=(l+r)/2;        double mid2=(mid1+r)/2;        if(cal(mid1)>=cal(mid2))            l=mid1;        else            r=mid2;    }    return l;}int main(){   int icase,T=1;   scanf("%d",&icase);   while(icase--)   {       scanf("%d",&n);       for(int i=0;i<n;i++)        scanf("%lf%lf%lf%lf",&x[i],&y[i],&vx[i],&vy[i]);       double t=solve();       printf("Case #%d: %.2lf %.2lf\n",T++,t,cal(t));   }   return 0;}