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

hdu 4717 三分查找

时间:2016-08-08 12:19:34      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717

题      意:n个点的起始坐标和它们的运动方向,求这n个点的在哪个时刻最远距离最小

题      解:两点的距离为一个二次函数,对时间进行三分查找答案

 

技术分享
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

struct point
{
    double x,y;
    double vx,vy;
}p[305];

int n;

double dis(point a,point b,double t)
{
    a.x+=a.vx*t;
    a.y+=a.vy*t;
    b.x+=b.vx*t;
    b.y+=b.vy*t;
    return sqrt ( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );
}

double check(double t)
{
    double MAX=0;
    for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++)
            MAX=max(MAX,dis(p[i],p[j],t));
    return MAX;
}

int main()
{
    int t;
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i].vx,&p[i].vy);
        double l=0;
        double r=1000000;
        while(l+1e-6<r)
        {
            double mid1=(l+r)/2.0;
            double mid2=(mid1+r)/2.0;
            if(check(mid1)<check(mid2)) r=mid2;
            else l=mid1;
        }
        printf("Case #%d: %.2lf %.2lf\n",cas,l,check(l));
    }
    return 0;
}
View Code

 

hdu 4717 三分查找

标签:

原文地址:http://www.cnblogs.com/mgxj/p/5748636.html

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