本解析转自:http://www.cnblogs.com/acmdeweilai/archive/2013/09/11/3315769.html
说明下为啥满足三分:
设y=f(x) (x>0)表示任意两个点的距离随时间x的增长,距离y的变化。则f(x)函数单调性有两种:1.先单减,后单增。2.一直单增。
设y=m(x) (x>0)表示随时间x的增长,所有点的最大距离y的变化。即m(x)是所有点对构成的f(x)图像取最上面的部分。则m(x)的单调性也只有两种可能:1.先单减,后单增。2.一直单增。 这个地方的证明可以这样:假如时刻t1到时刻t2最大值取得是函数f1(x)的图像,在时刻t2到时刻t3取得是f2(x)的图像,
那么由图可以看出f2(x)的斜率大于f1(x)的斜率(会有折点)
可以归纳出m(x)函数的斜率是递增。那么单调性就可以知道了。
m(x)有了上面的性质,就可以有三分了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#define M 305
#define mod 1000000007
#define INF 0x7fffffff
#define eps 1e-6
#define LL long long
#define LLU unsigned long long
using namespace std;
struct Point{
int x, y, dx, dy;
int readPoint()
{
return scanf("%d%d%d%d", &x, &y, &dx, &dy);
}
}st[M];
int dcmp(double x)
{
if(x<eps) return 0;
return x<0?-1:1;
}
double dis(Point a, Point b, double time)
{
double x = (a.x+time*a.dx)-(b.x+time*b.dx);
double y = (a.y+time*a.dy)-(b.y+time*b.dy);
return sqrt(x*x+y*y);
}
int n;
double val(double x)
{
double ans = 0.0;
for(int i = 0; i < n; ++i)
for(int j = i+1; j < n; ++j)
ans = max(ans, dis(st[i], st[j], x));
return ans;
}
int main ()
{
int t, k = 0;
scanf("%d",&t);
while(t--)
{
scanf("%d", &n);
for(int i = 0; i < n; ++i)
st[i].readPoint();
double l = 0.0, r = 100.0;
while(dcmp(r-l)>0)
{
double mid = (l+r)/2;
double midmid = (mid+r)/2;
if(dcmp(val(mid)-val(midmid))>0)
l = mid;
else
r = midmid;
}
printf("Case #%d: %.2lf %.2lf\n", ++k, l, val(l));
}
return 0;
}