HDU 4717 The Moving Points (三分法)

题意:给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)
{
    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;
}

HDU 4717 The Moving Points (三分法)

时间: 2024-10-21 21:17:56

HDU 4717 The Moving Points (三分法)的相关文章

hdu 4717 The Moving Points(三分)

题目链接:hdu 4717 The Moving Points 题意: 在二维平面上有n个点,每个点给出移动的方向和速度. 问在某个时刻,这些点中最大距离最小是多少,输出时刻和距离. 题解: 我们可以知道,每个点对的距离要么是单调递增,要么是有一个峰的函数. 举例画一下可知道合成的这个函数最多只有一个峰,所以可以用三分求解. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespa

hdu 4717 The Moving Points(三分)

http://acm.hdu.edu.cn/showproblem.php?pid=4717 大致题意:给出每个点的坐标以及每个点移动的速度和方向.问在那一时刻点集中最远的距离在所有时刻的最远距离中最小. 比赛时一直以为是计算几何,和线段相交什么的有关.赛后队友说这是道三分,仔细想了想确实是三分,试着画画图发现它是一个凸性函数,存在一个最短距离.然后三分时间就可以了. #include <stdio.h> #include <iostream> #include <map&g

HDU-4717 The Moving Points(凸函数求极值)

The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2122    Accepted Submission(s): 884 Problem Description There are N points in total. Every point moves in certain direction and

hdu4717The Moving Points(三分)

链接 需要特判一下n=1的时候 精度调太低会超时 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 1

hdu 4717(三分) The Moving Points

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717 n个点,给出初始坐标和移动的速度和移动的方向,求在哪一时刻任意两点之间的距离的最大值的最小. 对于最大值的最小问题首先就会想到二分,然而由于两点之间的距离是呈抛物线状,所以三分的方法又浮上脑海,当然二分也可以做,不过思维上更复杂一些 1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<

ACM学习历程—HDU4717 The Moving Points(模拟退火 || 三分法)

Description There are N points in total. Every point moves in certain direction and certain speed. We want to know at what time that the largest distance between any two points would be minimum. And also, we require you to calculate that minimum dist

hdu 4717 三分查找

题目链接: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; doub

hdu 5626 Clarke and points

Clarke and points Problem Description The Manhattan Distance between point A(XA,YA) and B(XB,YB) is |XA - XB| + |Xb - YB|; the coordinate of each point is generated by the followed code. Input long long seed;inline long long rand(long long l, long lo

HDU 5144 NPY and shot(三分法)

当时做这道题时一直想退出物理公式来,但是后来推到导数那一部分,由于数学不好,没有推出来那个关于Θ的最值,后来直接暴力了,很明显超时了,忘了三分法的应用,这道题又是典型的三分求最值,是个单峰曲线,下面是代码 1 #include <stdio.h> 2 #include <math.h> 3 #define PI 3.1415926 4 int v, h; 5 double f(double i)//推倒物理公式 6 { 7 return v*v*1.0*sin(2*i)/9.8+(