HDU4717

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;
}

你可能感兴趣的:(函数,移动)