HDU 4717 The Moving Points (三分法)

时间:2021-10-10 07:04:07

题意:给n个点的坐标的移动方向及速度,问在之后的时间的所有点的最大距离的最小值是多少。

思路:三分。两点距离是下凹函数,它们的max也是下凹函数。可以三分。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cmath>
#include<vector>
#define LL long long
#define MAXN 100005
using namespace std;
struct Point
{
    double x,y,vx,vy;
    Point(double a,double b,double c,double d):x(a),y(b),vx(c),vy(d) {}
};
vector<Point> vec;
double calc(double time)
{
    ;
    ; i<vec.size(); ++i)
        ; j<vec.size(); ++j)
        {
            double nx=vec[i].x+vec[i].vx*time,ny=vec[i].y+vec[i].vy*time;
            double mx=vec[j].x+vec[j].vx*time,my=vec[j].y+vec[j].vy*time;
            maxn=max(maxn,(sqrt((nx-mx)*(nx-mx)+(ny-my)*(ny-my))));
        }
    return maxn;

}
int main()
{
    ;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        vec.clear();
        ;i<n;++i)
        {
            double a,b,c,d;
            scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
            vec.push_back(Point(a,b,c,d));
        }
        ,R=1e8;
        ; i<; ++i)
        {
            ;
            ;
            if(calc(m1)<calc(m2)) R=m2;
            else L=m1;
        }
        printf("Case #%d: %.2lf %.2lf\n",++kase,L,calc(L));
    }
    ;
}