码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4717 The Moving Points (三分法)

时间:2014-08-05 22:01:50      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   art   

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

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

bubuko.com,布布扣
#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)
{
    double maxn=0;
    for(int i=0; i<vec.size(); ++i)
        for(int j=i+1; 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()
{
    int T,kase=0;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        vec.clear();
        for(int i=0;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));
        }
        double L=0,R=1e8;
        for(int i=0; i<100; ++i)
        {
            double m1=L+(R-L)/3;
            double m2=R-(R-L)/3;
            if(calc(m1)<calc(m2)) R=m2;
            else L=m1;
        }
        printf("Case #%d: %.2lf %.2lf\n",++kase,L,calc(L));
    }
    return 0;
}
View Code

 

HDU 4717 The Moving Points (三分法),布布扣,bubuko.com

HDU 4717 The Moving Points (三分法)

标签:style   blog   http   color   os   io   for   art   

原文地址:http://www.cnblogs.com/kkkwjx/p/3893033.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!