HDU4717

3426 ワード

Problem:The Moving Points Description:平面座標系にはn個の点があり、これらの点は一定の速度(ベクトル)で移動します.これらの点の任意の2点間距離の最大値がある時点での最小値を求めさせます.Solution:3点.最初はテーマを読み間違えたので、任意の2点間の距離の最小値を求めると思っていました.2点距離式を書くと,これは時間Tに関する二次関数であることがわかる.では、凹関数です.この時は3点が最適な解法です.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
"
,K++,time,sqrt(cal(time))); } return 0; }